Udostępnij przez


Tworzenie kodera przy użyciu klasy CoCreateInstance

Do konwertowania plików multimedialnych na format ASF można użyć koderów Windows Media. Aby korzystać z tych koderów, muszą być zarejestrowane w systemie. Kodery są implementowane jako Media Foundation przekształca (MFTs) i muszą uwidocznić interfejs IMFTransform. W tym temacie opisano, jak aplikacja może uzyskać wskaźnik do wymaganego interfejsu IMFTransform kodera MFT i utworzyć jego wystąpienie do użycia.

Aby uzyskać informacje na temat rejestracji kodera, zobacz inicjalizację kodera MFT.

Korzystanie z interfejsu IMFTransform kodera

Po pomyślnej rejestracji koderów Windows Media w systemie aplikacja może wyliczyć kodery, wywołując MFTEnum. Aby wyszukać odpowiedni koder, należy określić następujące elementy:

  • Identyfikator GUID, który reprezentuje kategorię, to albo MFT_CATEGORY_AUDIO_ENCODER, albo MFT_CATEGORY_VIDEO_ENCODER.

  • Format, który trzeba dopasować. Jest to ustawione w strukturze MFT_REGISTER_TYPE_INFO, która określa typ główny i podtyp typu nośnika, w których koder będzie generować przykłady. Ta struktura jest przekazywana w parametrze pOutputType. Aby uzyskać informacje o obsługiwanych typach, zobacz identyfikatory GUID typu nośnika .

    Notatka

    Informacje o typie wejściowym w parametrze pInputType nie są wymagane. Dzieje się tak, ponieważ typ danych wejściowych jest znany aplikacji, a koder oczekuje, że strumień wejściowy będzie w formacie nieskompresowanym.

     

MFTEnum zwraca tablicę wskaźników IMFTransform dla kodera MFT, które spełniają kryteria wyszukiwania. Możesz utworzyć wystąpienie enkodera, wywołując funkcję COM CoCreateInstance i przekazując identyfikator CLSID enkodera, którego chcesz użyć. Ta funkcja zwraca wskaźnik do interfejsu IMFTransform, który reprezentuje koder. Aby uzyskać więcej informacji na temat tego wywołania funkcji, zobacz dokumentację zestawu Windows SDK dotyczącą modelu obiektów składników (COM).

Przykład tworzenia kodera

W poniższym przykładzie kodu pokazano, jak utworzyć koder audio lub wideo.

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;
}

utworzenie wystąpienia MFT kodera

Windows Media Encoderów