Partilhar via


Usando os codecs de mídia de janela no DirectShow

Os objetos de codificador e decodificador de Áudio e Vídeo do Windows Media foram originalmente projetados e otimizados para trabalhar com o formato de contêiner de arquivo ASF e o SDK do Formato de Mídia do Windows. Os objetos codec funcionam bem no DirectShow para determinados cenários, ou seja, CBR de passagem única e codificação VBR baseada em qualidade de fluxos de vídeo. Mas se você estiver considerando usar os objetos codec diretamente no DirectShow usando contêineres de arquivos diferentes do ASF, há certos comportamentos e problemas que você deve estar ciente com antecedência.

Observação

Se você usar codecs autônomos com o DirectShow, provavelmente desejará usá-los apenas como DMOs. Em outras palavras, você usará a interface IMediaObject em vez de IMFTransform.

 

Áudio WM em arquivos AVI

Você pode usar o DirectShow para codificar fluxos WMA em qualquer formato de contêiner de arquivo para o qual você tenha um filtro multiplexer. No entanto, as interfaces de codec de Áudio e Vídeo do Windows Media não dão suporte ao WMA em arquivos AVI porque é impossível, usando os filtros de reprodução do DirectShow AVI padrão, manter a sincronização de áudio-vídeo em um arquivo AVI com um fluxo WMA. Para obter mais informações, consulte Armazenando mídia compactada em arquivos AVI.

O DMO do codificador de áudio gera exemplos de duração variável, mesmo quando no modo "taxa de bits constante". Portanto, ele funciona melhor com formatos de contêiner de arquivos que usam carimbos de data/hora. Os arquivos AVI não fornecem um carimbo de data/hora para cada exemplo de áudio ou grupo de exemplos. No DirectShow, o filtro Divisor de AVI fabrica carimbos de data/hora para cada grupo de amostras (cada quadro de áudio) com base no valor nAvgBytesPerSec na estrutura WAVEFORMATEX no cabeçalho do fluxo AVI.

A suposição subjacente a esse cálculo é que todos os exemplos de áudio no fluxo têm duração igual; no entanto, os exemplos de saída pelo DMO não são de duração igual e, portanto, os carimbos de data/hora aplicados pelo Divisor de AVI não são precisos. Portanto, não é possível, sem modificar o Divisor de AVI ou o DMO do decodificador de áudio, usar qualquer aplicativo baseado em DirectShow para reproduzir arquivos AVI com fluxos de áudio e vídeo em sincronia. O codec de Voz do Windows Media Audio 9 funcionará em alguns casos, mas mesmo isso perderá a sincronização após qualquer operação de busca, portanto, ele realmente não pode ser considerado uma solução viável.

Se você tiver um codificador MP3, poderá criar arquivos AVI com WMV e MP3 para o fluxo de áudio. Esses arquivos serão reproduzidos e procurarão corretamente em Reprodutor Multimídia do Windows e em outros aplicativos baseados em DirectShow, pois o Divisor de AVI contém código de tratamento especial para fluxos MP3. Outra opção é usar áudio PCM descompactado, embora obviamente o tamanho do arquivo resultante seja muito maior do que com um fluxo de áudio compactado. Como o aplicativo de exemplo DirectShow cria arquivos AVI, ele não demonstra como usar o DMO do codificador de áudio.

Codificação de passagem única

O DMO do codificador de vídeo funciona facilmente no DirectShow para dois modos de codificação: CBR e VBR baseado em qualidade. Desde que você siga a ordem correta das operações ao criar o grafo de filtro, conforme demonstrado no aplicativo de exemplo, é relativamente simples colocar o conteúdo WMV em um arquivo AVI usando o Multiplexer AVI e o Gravador de Arquivos.

Codificação de duas passões

Os modos de codificação de duas passões exigem uma abordagem mais complexa para a criação e o streaming de grafo, a fim de impedir que o DMO libere seu conteúdo da primeira passagem antes de iniciar a segunda passagem. Na codificação de duas passões, é necessário executar o grafo uma vez para que o DMO possa executar sua análise de pré-processamento dos dados do arquivo e, em seguida, rebobinar o grafo e executá-lo novamente para que o DMO possa fazer a codificação real.

Quando o grafo entra em um estado de execução para a segunda passagem, o Wrapper de DMO define o sinalizador DISCONTINUITY no primeiro exemplo, pois o carimbo de data/hora não é sequencial com o último carimbo de data/hora na primeira passagem. Quando o DMO, que não foi projetado para funcionar no DirectShow dessa forma, recebe o sinalizador DISCONTINUITY, ele executa uma liberação e perde os dados armazenados da primeira passagem. Para contornar esse problema, a melhor solução provavelmente é escrever um filtro wrapper de DMO personalizado que não define o sinalizador DISCONTINUITY quando o grafo é procurado após a primeira passagem. O exemplo de Vídeo para Windows (VfW) neste SDK demonstra como executar a codificação de duas passões.

Conteúdo entrelaçado

O DMO do codificador WMV é capaz de codificar conteúdo entrelaçado preservando a interlacção, o que é útil para o conteúdo capturado de uma TV e também pode ser reproduzido em uma TV. No entanto, não é possível preservar a interlação usando o Wrapper de DMO padrão, pois esse filtro não dá suporte ao INSSBuffer em seus exemplos de entrada.

O DMO usa essa interface para obter as configurações entrelaçadas para cada exemplo que recebe. Se a interface não for encontrada, como é o caso do Wrapper de DMO, o DMO simplesmente tratará os exemplos de entrada como não entrelaçados. Para executar a codificação entrelaçada no DirectShow, há várias alternativas. A abordagem mais fácil provavelmente é usar o SDK do Windows Media Format 9 Series diretamente ou usando o filtro DirectShow do Gravador ASF do WM, para criar um arquivo ASF entrelaçado. Em seguida, você pode transcodificar esse arquivo em algum outro formato. Se você transcodificar para a AVI, terá um arquivo entrelaçado, mas os filtros de reprodução AVI do DirectShow padrão não o reconhecerão como tal porque eles não dão suporte a VIDEOINFOHEADER2. Outra abordagem é escrever seu próprio filtro Wrapper de DMO que dê suporte à interface INSSBuffer .

Trabalhando com DMOs codec