使用 CoCreateInstance 建立編碼器

若要將媒體檔案轉換成 ASF 格式,您可以使用 Windows 媒體編碼器。 若要使用這些編碼器,則必須向系統註冊這些編碼器。 編碼器會實作為 媒體基礎轉換 (MFT) ,而且必須公開 IMFTransform 介面。 本主題描述應用程式如何取得所需 MFT 編碼器之 IMFTransform 介面的指標,並將其具現化以供使用。

如需編碼器註冊的相關資訊,請參閱 具現化編碼器 MFT

使用編碼器的 IMFTransform 介面

成功向系統註冊 Windows 媒體編碼器時,應用程式可以呼叫 MFTEnum來列舉編碼器。 若要搜尋正確的編碼器,您必須指定下列專案:

  • 表示類別的 GUID,其為 MFT_CATEGORY_AUDIO_ENCODERMFT_CATEGORY_VIDEO_ENCODER

  • 要比對的格式。 這會設定在 MFT_REGISTER_TYPE_INFO 結構中,指定編碼器將產生樣本之媒體類型的主要類型和子類型。 這個結構會在 pOutputType 參數中傳遞。 如需支援類型的相關資訊,請參閱 媒體類型 GUID

    注意

    不需要 pInputType 參數中的輸入類型資訊。 這是因為應用程式知道輸入類型,而編碼器預期輸入資料流程的格式為未壓縮格式。

     

MFTEnum 會針對符合搜尋準則的編碼器 MFT 傳回 IMFTransform 指標陣列。 您可以呼叫 COM 函式 CoCreateInstance 並傳遞您想要使用的編碼器 CLSID 來具現化編碼器。 此函式會傳回代表編碼器之 IMFTransform 介面的指標。 如需此函式呼叫的詳細資訊,請參閱元件物件模型 (COM) 的 Windows SDK 檔。

編碼器建立範例

下列程式碼範例示範如何建立音訊或視訊編碼器。

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 媒體編碼器