Поделиться через


Создание кодировщика с помощью 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;
}

Создание экземпляра кодировщика MFT

Кодировщики Windows Media