Partilhar via


Usando os codecs de mídia de janela no DirectShow

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

Observação

Se você vai usar codecs autônomos com DirectShow, você provavelmente vai querer usá-los apenas como DMOs. Em outras palavras, você estará usando o 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 multiplexador. No entanto, as interfaces de codec de áudio e vídeo do Windows Media não suportam WMA em arquivos AVI porque é impossível, usando os filtros de reprodução padrão DirectShow AVI, manter a sincronização de áudio e vídeo em um arquivo AVI com um fluxo WMA. Para obter mais informações, consulte Armazenando mídia compactada em arquivos AVI.

O codificador de áudio DMO emite amostras de duração variável, mesmo quando em modo de "taxa de bits constante". Portanto, ele funciona melhor com formatos de contêiner de arquivo que usam carimbos de data/hora. Os arquivos AVI não fornecem um carimbo de data/hora para cada amostra de áudio ou grupo de amostras. No DirectShow, o filtro AVI Splitter fabrica marcas temporais 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 este cálculo é que todas as amostras de áudio no fluxo são de duração igual; no entanto, as amostras saídas pelo DMO não são de igual duração e, portanto, os carimbos de data/hora aplicados pelo divisor AVI não são precisos. Portanto, não é possível, sem modificar o divisor AVI ou o decodificador de áudio DMO, 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, então realmente não pode ser considerado uma solução viável.

Se você tiver um codificador MP3, você pode criar arquivos AVI com WMV e MP3 para o fluxo de áudio. Esses arquivos serão reproduzidos e procurados corretamente no Windows Media Player e em outros aplicativos baseados em DirectShow, porque o AVI Splitter contém código de manipulação especial para fluxos de MP3. Outra opção é usar áudio PCM não comprimido, embora, obviamente, o tamanho do arquivo resultante será muito maior do que com um fluxo de áudio comprimido. Como o aplicativo de exemplo DirectShow cria arquivos AVI, ele não demonstra como usar o codificador de áudio DMO.

Codificação em uma etapa

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

Codificação em duas etapas

Os modos de codificação em duas passagens exigem uma abordagem mais complexa para a construção de gráficos e o processamento de fluxos de dados, a fim de evitar que o DMO descarregue seu conteúdo da primeira passagem antes de iniciar a segunda passagem. Na codificação em duas etapas, é necessário executar o gráfico uma vez para que o DMO possa realizar sua análise de pré-processamento dos dados do arquivo e, em seguida, retroceder novamente o gráfico e executá-lo novamente para que o DMO possa fazer a codificação real.

Quando o gráfico entra num estado de execução para a segunda passagem, o DMO Wrapper define o flag DISCONTINUITY na primeira amostra, porque o timestamp não é sequencial com o último timestamp na primeira passagem. Quando o DMO, que não foi projetado para funcionar no DirectShow dessa forma, recebe o sinalizador DESCONTINUIDADE, ele executa uma limpeza e perde os dados armazenados da primeira passagem. Para contornar esse problema, a melhor solução é provavelmente escrever um filtro DMO Wrapper personalizado que não define o sinalizador de descontinuidade quando o gráfico é procurado após a primeira passagem. O exemplo de vídeo para Windows (VfW) neste SDK demonstra como executar a codificação em duas etapas.

Conteúdo entrelaçado

O codificador WMV DMO é capaz de codificar conteúdo entrelaçado, preservando o entrelaçamento, o que é útil para conteúdo capturado de uma TV e também pode ser reproduzido em uma TV. No entanto, não é possível preservar o entrelaçamento usando o DMO Wrapper padrão, porque esse filtro não suporta INSSBuffer em suas amostras de entrada.

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

Trabalhar com Codecs DMO