Compartilhar via


Configurando o objeto Splitter do ASF

O objeto divisor ASF é um objeto de camada WMContainer que analisa o objeto de dados ASF de um arquivo ASF (Advanced Systems Format). Depois que o divisor é criado e inicializado para analisar o objeto de dados ASF de um arquivo de mídia, o divisor deve ser configurado para gerar amostras para fluxos específicos. Chame IMFASFSplitter::SelectStreams para selecionar os fluxos necessários.

Opcionalmente, um aplicativo também pode configurá-lo para gerar amostras em ordem inversa ou gerar amostras para conteúdo protegido. Para definir essas opções, chame IMFASFSplitter::SetFlags e passe a combinação bit a bit necessária dos sinalizadores com suporte. Antes de chamar esse método, o cliente deve concluir a chamada IMFASFSplitter::Initialize com êxito; caso contrário, SetFlags falhará com MF_E_NOT_INITIALIZED código de erro. Para obter informações sobre como inicializar o divisor, consulte Criando o objeto divisor ASF.

Para marcar se esse sinalizador está atualmente definido no divisor, chame IMFASFSplitter::GetFlags.

Selecionando fluxos para análise

Durante o processo de inicialização por meio da chamada IMFASFSplitter::Initialize , o divisor detecta o número de fluxos e os identificadores de fluxo no arquivo ASF. Por padrão, nenhum fluxo é selecionado pelo divisor. O aplicativo deve selecionar os fluxos chamando IMFASFSplitter::SelectStreams. Esse método usa uma matriz de números de fluxo. Para obter o número de fluxo de um fluxo, chame IMFASFProfile::GetStream no perfil do ASF ou chame IMFStreamDescriptor::GetStreamIdentifier no descritor de fluxo. (Você pode obter o perfil asf e o descritor de fluxo do objeto ContentInfo.) Se o cliente passar um número de fluxo que não é reconhecido pelo divisor, ele falhará com um erro de MF_E_INVALIDSTREAMNUMBER .

Chamar SelectStreams limpa as seleções anteriores. Qualquer fluxo que não seja especificado na matriz não está selecionado. Para obter uma lista de fluxos que estão selecionados no momento, chame IMFASFSplitter::GetSelectedStreams. Esse método usa um ponteiro para uma matriz, que o método preenche com os números de fluxo. Se o tamanho da matriz for menor que o número de fluxos selecionados, o método falhará com o erro MF_E_BUFFERTOOSMALL . Nesse caso, o método retorna o número de fluxos selecionados no parâmetro pwNumStreams . Em seguida, você pode usar esse número para alocar uma matriz do tamanho correto e chamar o método novamente.

Por exemplo, confira "Selecionar um fluxo para análise" no Tutorial: Lendo um arquivo ASF.

Configuração de Reprodução Inversa

Durante o processo de inicialização do divisor, ele determina se o conteúdo do ASF dá suporte à reprodução inversa. Se isso acontecer, o divisor poderá ser configurado para gerar amostras na ordem inversa definindo o sinalizador MFASF_SPLITTER_REVERSE . Se o conteúdo não der suporte à reprodução inversa, o IMFASFSplitter::SetFlags retornará MF_E_INVALIDREQUEST, mas o sinalizador será definido no divisor.

Se o divisor estiver configurado para analisar na direção inversa, o divisor sempre começará a analisar no final do buffer que contém o Objeto de Dados ASF. Portanto, para a análise inversa do deslocamento de dados e o comprimento dos dados a serem analisados, deve ser definido adequadamente. Para obter informações sobre como definir os valores corretos, consulte Gerando exemplos de fluxo de um objeto de dados ASF existente.

Configuração de conteúdo protegido

O divisor pode ser configurado para funcionar com o conteúdo de criptografia no nível do pacote definindo o MFASF_SPLITTER_WMDRM por meio de IMFASFSplitter::SetFlags. Isso instrui o divisor a fornecer amostras de conteúdo protegido pelo DRM (Gerenciamento de Direitos Digitais) do Windows Media. Quando esse sinalizador é definido, os exemplos gerados pelo divisor contêm informações necessárias para descriptografar dados de mídia e reconstruir os quadros, como o atributo MFSampleExtension_PacketCrossOffsets . Esse atributo é um blob que contém uma matriz de DWORDs. Cada DWORD fornece os limites de carga para o quadro em relação ao início do quadro. Se esse atributo não estiver presente, o quadro estará contido em uma única carga. Normalmente, os exemplos gerados pelo divisor contêm vários buffers de mídia, o aplicativo pode copiar todos os buffers em um buffer contíguo chamando IMFSample::ConvertToContiguousBuffer. O buffer resultante contém o quadro e o valor do atributo contém deslocamentos para esse buffer.

Divisor ASF