Создание кодировщика с помощью coCreateInstance
Для преобразования файлов мультимедиа в формат ASF можно использовать кодировщики Windows Media. Чтобы использовать эти кодировщики, они должны быть зарегистрированы в системе. Кодировщики реализуются как преобразования Media Foundation (MFT) и должны предоставлять интерфейс IMFTransform. В этом разделе описывается, как приложение может получить указатель на интерфейс IMFTransform необходимого кодировщика MFT и создать его экземпляр для использования.
Сведения о регистрации кодировщика см. в разделе Создание экземпляра кодировщика MFT.
Использование интерфейса IMFTransform кодировщика
После успешной регистрации кодировщиков Windows Media в системе приложение может перечислить кодировщики, вызвав MFTEnum. Чтобы найти нужный кодировщик, необходимо указать следующее:
Идентификатор GUID, представляющий категорию, которая является MFT_CATEGORY_AUDIO_ENCODER или MFT_CATEGORY_VIDEO_ENCODER.
Формат для сопоставления. Он задается в структуре MFT_REGISTER_TYPE_INFO , которая указывает основной тип и подтип типа мультимедиа, в котором кодировщик будет создавать образцы. Эта структура передается в параметре pOutputType . Сведения о поддерживаемых типах см. в разделе Идентификаторы GUID типов мультимедиа.
Примечание
Сведения о входном типе в параметре pInputType не требуются. Это связано с тем, что тип входных данных известен приложению, и кодировщик ожидает, что входной поток будет иметь несжатый формат.
MFTEnum возвращает массив указателей IMFTransform для MFT кодировщика, соответствующих условиям поиска. Вы можете создать экземпляр кодировщика, вызвав com-функцию CoCreateInstance и передав CLSID нужного кодировщика. Эта функция возвращает указатель на интерфейс IMFTransform , представляющий кодировщик. Дополнительные сведения об этом вызове функции см. в документации windows SDK по компонентной объектной модели (COM).
Пример создания кодировщика
В следующем примере кода показано, как создать кодировщик звука или видео.
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;
}
Связанные темы