ASF プロファイルの作成

このトピックでは、Microsoft Media Foundation で ASF プロファイルとして作成する方法について説明します。

新しいプロファイルを作成する

空の ASF プロファイルを作成するには、 MFCreateASFProfile 関数を 呼び出します。 この関数は、 IMFASFProfile インターフェイスへのポインターを返します。 アプリケーションでは、このインターフェイスを使用して、プロファイルにストリームを追加し、各ストリームを構成できます。 詳細については、「 ASF ストリームの作成と構成」を参照してください。

必要に応じて、アプリケーションは 2 つ以上のストリームに相互除外オブジェクトを追加できます。 ASF ストリームの相互除外の使用に関するページを参照してください。

ASF ContentInfo オブジェクトからプロファイルを取得する

アプリケーションは、ASF ContentInfo オブジェクトから既存の ASF ファイルの ASF プロファイルを取得できます。 プロファイルは既に構成されており、ファイル内のすべてのストリームの設定が含まれています。

ファイルの ASF ヘッダー オブジェクトを解析して ContentInfo オブジェクトを初期化します。 これは、 IMFASFContentInfo::P arseHeader メソッドを使用して行われます。 すべてのヘッダー オブジェクトが読み取られ、ASF ライブラリが設定されると、このファイルのプロファイルが生成されます。 アプリケーションは、 IMFASFContentInfo::GetProfile を呼び出すことによって、この初期化されたプロファイルへのポインターを取得できます。

プレゼンテーション記述子からプロファイルを取得する

既存の ASF ファイルのプロファイル オブジェクトは、ファイルの プレゼンテーション記述子 または ASF ContentInfo オブジェクトから取得できます。 この場合、プロファイルは既に構成されており、ファイル内のすべてのストリームの設定が含まれています。 これは、既存の ASF プロファイルを変更する場合に便利です。 たとえば、より低いビット レートで Windows Media Video ファイルを再エンコードしたい場合があります。

プレゼンテーション記述子からプロファイルを取得するには、 MFCreateASFProfileFromPresentationDescriptor を呼び出します。 この関数は、プレゼンテーション記述子を解析し、ASF プロファイルにメディア ファイルに関する情報を設定します。 関数は、IMFASFProfile インターフェイスへのポインターを返します。 その後、このインターフェイスを使用してプロファイルを変更できます。

プレゼンテーション記述子を取得するには、次のいずれかのメソッドを呼び出します。

  • ASF メディア ソースから、 IMFMediaSource::CreatePresentationDescriptor を呼び出します。
  • ASF ContentInfo オブジェクトから、IMFASFContentInfo::GeneratePresentationDescriptor を呼び出します。 このメソッドを呼び出す前に、ContentInfo オブジェクトが読み取り用に初期化されていることを確認してください。 詳細については、「既存のファイルの ASF ヘッダー オブジェクトの読み取り」の「既存の ASF ファイルからの ContentInfo オブジェクトの初期化」を参照してください。 ただし、既に初期化された ContentInfo オブジェクトがある場合は、そこから直接プロファイルを取得できます。 これについては、このトピックで後述する「ContentInfo オブジェクトからプロファイルを取得する」で説明します。

次の例は、プレゼンテーション記述子からプロファイルを作成する方法を示しています。 関数は、ファイルのメディア ソースを作成し、メディア ソースからプレゼンテーション記述子を取得し、プロファイルを作成します。 この例では、 pszFileName が ASF ファイルの URL を指定していることを前提としています。

HRESULT GetASFProfile(PCWSTR pszFileName, IMFASFProfile** ppProfile)
{
    *ppProfile = NULL;

    IMFSourceResolver* pResolver = NULL;
    IUnknown* pSourceUnk = NULL;
    IMFMediaSource* pSource = NULL;
    IMFPresentationDescriptor* pPD = NULL;

    // Create the source resolver.
    HRESULT hr = MFCreateSourceResolver(&pResolver);

    // Use the source resolver to create the media source.
    if (SUCCEEDED(hr))
    {
        MF_OBJECT_TYPE ObjectType;

        hr = pResolver->CreateObjectFromURL(
                pszFileName,
                MF_RESOLUTION_MEDIASOURCE, 
                NULL,                      
                &ObjectType,               
                &pSourceUnk   
            );
    }

    // Get the IMFMediaSource interface from the media source.
    if (SUCCEEDED(hr))
    {
        hr = pSourceUnk->QueryInterface(IID_PPV_ARGS(&pSource));
    }

    // Get the presentation descriptor.
    if (SUCCEEDED(hr))
    {
        hr = pSource->CreatePresentationDescriptor(&pPD);
    }

    // Get the profile from the presentation descriptor.
    if (SUCCEEDED(hr))
    {
        hr = MFCreateASFProfileFromPresentationDescriptor(pPD, ppProfile);
    }

    SafeRelease(&pResolver);
    SafeRelease(&pSourceUnk);
    SafeRelease(&pSource);
    SafeRelease(&pPD);
    return hr;
}

この例では 、SafeRelease を使用してインターフェイス ポインターを解放します。

ASF プロファイル