Criando um codificador usando CoCreateInstance
Para converter arquivos de mídia em formato ASF, você pode usar codificadores do Windows Media. Para usar esses codificadores, eles devem ser registrados no sistema. Os codificadores são implementados como MFTs ( transformações do Media Foundation ) e devem expor a interface IMFTransform. Este tópico descreve como um aplicativo pode obter um ponteiro para a interface IMFTransform do codificador MFT necessária e instanciá-lo para uso.
Para obter informações sobre o registro do codificador, consulte Instanciando um MFT codificador.
Usando a interface IMFTransform de um codificador
Após o registro bem-sucedido de codificadores do Windows Media com o sistema, um aplicativo pode enumerar os codificadores chamando MFTEnum. Para pesquisar o codificador certo, especifique o seguinte:
O GUID que representa a categoria, que é MFT_CATEGORY_AUDIO_ENCODER ou MFT_CATEGORY_VIDEO_ENCODER.
O formato a ser correspondido. Isso é definido na estrutura MFT_REGISTER_TYPE_INFO que especifica o tipo principal e o subtipo do tipo de mídia no qual o codificador gerará exemplos. Essa estrutura é passada no parâmetro pOutputType . Para obter informações sobre os tipos com suporte, consulte GUIDs de tipo de mídia.
Observação
As informações de tipo de entrada no parâmetro pInputType não são necessárias. Isso ocorre porque o tipo de entrada é conhecido pelo aplicativo e o codificador espera que o fluxo de entrada esteja em um formato não compactado.
MFTEnum retorna uma matriz de ponteiros IMFTransform para os MFTs do codificador que correspondem aos critérios de pesquisa. Você pode instanciar um codificador chamando a função COM CoCreateInstance e passando o CLSID do codificador que deseja usar. Essa função retorna um ponteiro para a interface IMFTransform que representa o codificador. Para obter mais informações sobre essa chamada de função, consulte a documentação do SDK do Windows para o COM (Component Object Model).
Exemplo de criação do codificador
O exemplo de código a seguir mostra como criar um codificador de áudio ou vídeo.
HRESULT FindEncoder(
const GUID& subtype,
BOOL bAudio,
IMFTransform **ppEncoder
)
{
HRESULT hr = S_OK;
UINT32 count = 0;
CLSID *ppCLSIDs = NULL;
MFT_REGISTER_TYPE_INFO info = { 0 };
info.guidMajorType = bAudio ? MFMediaType_Audio : MFMediaType_Video;
info.guidSubtype = subtype;
hr = MFTEnum(
bAudio ? MFT_CATEGORY_AUDIO_ENCODER : MFT_CATEGORY_VIDEO_ENCODER,
0, // Reserved
NULL, // Input type
&info, // Output type
NULL, // Reserved
&ppCLSIDs,
&count
);
if (SUCCEEDED(hr) && count == 0)
{
hr = MF_E_TOPO_CODEC_NOT_FOUND;
}
// Create the first encoder in the list.
if (SUCCEEDED(hr))
{
hr = CoCreateInstance(ppCLSIDs[0], NULL,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(ppEncoder));
}
CoTaskMemFree(ppCLSIDs);
return hr;
}
Tópicos relacionados