Negociação de tipo de mídia no codificador
No Microsoft Media Foundation, os codificadores são implementados como MFTs ( transformações do Media Foundation ) com uma entrada e uma saída. Antes de uma sessão de codificação, um codificador precisa saber as características do fluxo que receberá como entrada e o formato do fluxo que produzirá como saída. Você deve definir os tipos de mídia de entrada e saída e as características relacionadas antes de passar dados pelo codificador. Você deve fornecer os formatos de entrada e saída especificando os GUIDs de Tipo de Mídia apropriados e definir as características do fluxo de saída definindo os Atributos de Tipo de Mídia relevantes no tipo de mídia de saída. Um codificador recém-instanciado não tem nenhum tipo de mídia definido.
O tipo de mídia de entrada é um formato descompactado, como áudio PCM ou vídeo RGB. Os tipos de formato usados pelo codificador são limitados aos descritos pelas estruturas VIDEOINFOHEADER e WAVEFORMATEX . Para obter mais informações sobre essas estruturas, consulte a documentação do SDK do Windows. O Media Foundation fornece funções auxiliares para criar tipos de mídia a partir de estruturas de formato. Por exemplo, a função MFInitMediaTypeFromVideoInfoHeader inicializa um tipo de vídeo de uma estrutura VIDEOINFOHEADER e a função MFInitMediaTypeFromWaveFormatEx inicializa um tipo de vídeo de uma estrutura WAVEFORMATEX ou WAVEFORMATEXTENSIBLE . Para obter mais informações, consulte Conversões de tipo de mídia. Você deve definir o tipo de mídia de entrada no codificador chamando IMFTransform::SetInputType.
O tipo de mídia de saída é o formato de compactação usado no fluxo ou arquivo de origem final. Você pode definir o tipo de mídia de saída disponível somente depois de definir o tipo de mídia de entrada. Você pode recuperar os tipos de saída com suporte chamando IMFTransform::GetOutputAvailableType em um loop até que o codificador retorne MF_E_NO_MORE_TYPES. Incremente o índice de tipo com cada iteração. Quando você encontrar um tipo de mídia apropriado, defina o tipo de mídia de saída chamando IMFTransform::SetOutputType.
O fator decisivo na escolha do tipo de mídia de saída depende do tipo de codificação e dos requisitos de codificação. Por exemplo, para fluxos de áudio codificados em CBR, você deseja encontrar um tipo de mídia que corresponda à sua entrada e tenha uma taxa de bits o mais próxima possível de um valor de destino.
Se você quiser usar um modo de codificação diferente de CBR, defina o modo e enumere os tipos de saída para esse modo, pois o codificador altera os tipos de saída com suporte, dependendo do conjunto de modos. As propriedades que controlam o modo de codificação são MFPKEY_VBRENABLED e MFPKEY_PASSESUSED. Por exemplo, se você estiver enumerando tipos de saída para codificação de qualidade de VBR, o tipo de mídia dependerá do valor de qualidade que você decidir usar. Para obter informações sobre como definir essas propriedades, consulte Propriedades de codificação.
Tópicos relacionados