ソース リゾルバーの使用

ソース リゾルバーは URL またはバイト ストリームを受け取って、そのコンテンツに対応する適切なメディア ソースを作成します。 ソース リゾルバーを作成するには、 MFCreateSourceResolver を呼び出します。 この関数は、 IMFSourceResolver インターフェイス ポインターを返します。

ソース リゾルバーには、同期メソッドと非同期メソッドの両方があります。 メイン アプリケーション スレッドからソース リゾルバーを使用している場合、非同期メソッドを使用すると、ユーザー インターフェイスの応答性が向上します。 同期メソッドは、特にソース リゾルバーがネットワーク リソースを開く必要がある場合に、顕著な時間ブロックする可能性があります。

同期メソッドは次のとおりです。

非同期メソッドは次のとおりです。

非同期メソッドの場合、各メソッドには、非同期要求を完了するための対応する End... メソッドと、保留中の要求を取り消す Cancel... メソッドがあります。 Media Foundation の非同期メソッドの詳細については、「 非同期コールバック メソッド」を参照してください。

次のコード例では、URL からメディア ソースを作成します。 この例では、同期メソッドを使用します。

//  Create a media source from a URL.
HRESULT CreateMediaSource(PCWSTR sURL, IMFMediaSource **ppSource)
{
    MF_OBJECT_TYPE ObjectType = MF_OBJECT_INVALID;

    IMFSourceResolver* pSourceResolver = NULL;
    IUnknown* pSource = NULL;

    // Create the source resolver.
    HRESULT hr = MFCreateSourceResolver(&pSourceResolver);
    if (FAILED(hr))
    {
        goto done;
    }

    // Use the source resolver to create the media source.

    // Note: For simplicity this sample uses the synchronous method to create 
    // the media source. However, creating a media source can take a noticeable
    // amount of time, especially for a network source. For a more responsive 
    // UI, use the asynchronous BeginCreateObjectFromURL method.

    hr = pSourceResolver->CreateObjectFromURL(
        sURL,                       // URL of the source.
        MF_RESOLUTION_MEDIASOURCE,  // Create a source object.
        NULL,                       // Optional property store.
        &ObjectType,        // Receives the created object type. 
        &pSource            // Receives a pointer to the media source.
        );
    if (FAILED(hr))
    {
        goto done;
    }

    // Get the IMFMediaSource interface from the media source.
    hr = pSource->QueryInterface(IID_PPV_ARGS(ppSource));

done:
    SafeRelease(&pSourceResolver);
    SafeRelease(&pSource);
    return hr;
}

ソース リゾルバー