次の方法で共有


チュートリアル: WMA ファイルのエンコード

このチュートリアルでは、 Transcode API を使用して Windows Media Audio (WMA) ファイルをエンコードする方法について説明します。

このチュートリアルでは、チュートリアル「 MP4 ファイルのエンコード」のコードの大部分を再利用するため、まずそのチュートリアルをお読みください。 異なる唯一のコードは、トランスコード プロファイルを作成する 関数 CreateTranscodeProfileです。

トランスコード プロファイルを作成する

トランスコード プロファイルでは、エンコード パラメーターとファイル コンテナーについて説明します。 WMA の場合、ファイル コンテナーは Advanced Streaming Format (ASF) ファイルです。 ASF ファイルには、 Windows Media Audio Encoder を使用してエンコードされたオーディオ ストリームが含まれています。

トランスコード トポロジを構築するには、トランスコード プロファイルを作成し、オーディオ ストリームとコンテナーのパラメーターを指定します。 次に、入力ソース、出力 URL、およびトランスコード プロファイルを指定してトポロジを作成します。

プロファイルを作成するには、次の手順を実行します。

  1. 空のトランスコード プロファイルを作成するには、 MFCreateTranscodeProfile 関数を呼び出します。
  2. MFTranscodeGetAudioOutputAvailableTypes を呼び出して、エンコーダーからオーディオ メディアの種類の一覧を取得します。 この関数は、IMFMediaType ポインターのコレクションを表す IMFCollection ポインターを返します。
  3. トランスコードの要件に一致するオーディオ メディアの種類を選択し、属性ストアに属性をコピーします。 このチュートリアルでは、一覧の最初のメディアの種類を使用します。
    • IMFCollection::GetElement を呼び出して、一覧からオーディオ メディアの種類を選択します。
    • メディアの種類にクエリを実行して、メディアタイプの属性ストアの IMFAttributes インターフェイスへのポインターを取得します。
    • メディアの種類に含まれる属性の数を取得するには、 IMFAttributes::GetCount を呼び出します。
    • MFCreateAttributes を呼び出して、新しい属性ストアを作成します。
    • IMFAttributes::CopyAllItems を呼び出して、メディアの種類から新しい属性ストアに属性をコピーします。
  4. IMFTranscodeProfile::SetAudioAttributes を呼び出して、オーディオ ストリームの属性を設定します。
  5. MFCreateAttributes を呼び出して、コンテナー レベルの属性の属性ストアを作成します。
  6. MF_TRANSCODE_CONTAINERTYPE属性を MFTranscodeContainerType_ASF に設定します。これは、ASF ファイル コンテナーを指定します。
  7. IMFTranscodeProfile::SetContainerAttributes を呼び出して、プロファイルにコンテナー レベルの属性を設定します。
template <class Q>
HRESULT GetCollectionObject(IMFCollection *pCollection, DWORD index, Q **ppObj)
{
    IUnknown *pUnk;
    HRESULT hr = pCollection->GetElement(index, &pUnk);
    if (SUCCEEDED(hr))
    {
        hr = pUnk->QueryInterface(IID_PPV_ARGS(ppObj));
        pUnk->Release();
    }
    return hr;
}

HRESULT CreateTranscodeProfile(IMFTranscodeProfile **ppProfile)
{
    IMFTranscodeProfile *pProfile = NULL;     // Transcode profile.
    IMFCollection   *pAvailableTypes = NULL;  // List of audio media types.
    IMFMediaType    *pAudioType = NULL;       // Audio media type.
    IMFAttributes   *pAudioAttrs = NULL;      // Copy of the audio media type.
    IMFAttributes   *pContainer = NULL;       // Container attributes.

    DWORD dwMTCount = 0;
    
    // Create an empty transcode profile.
    HRESULT hr = MFCreateTranscodeProfile(&pProfile);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get output media types for the Windows Media audio encoder.

    // Enumerate all codecs except for codecs with field-of-use restrictions.
    // Sort the results.

    DWORD dwFlags = 
        (MFT_ENUM_FLAG_ALL & (~MFT_ENUM_FLAG_FIELDOFUSE)) | 
        MFT_ENUM_FLAG_SORTANDFILTER;

    hr = MFTranscodeGetAudioOutputAvailableTypes(MFAudioFormat_WMAudioV9, 
        dwFlags, NULL, &pAvailableTypes);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pAvailableTypes->GetElementCount(&dwMTCount);
    if (FAILED(hr))
    {
        goto done;
    }
    if (dwMTCount == 0)
    {
        hr = E_FAIL;
        goto done;
    }

    // Get the first audio type in the collection and make a copy.
    hr = GetCollectionObject(pAvailableTypes, 0, &pAudioType);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFCreateAttributes(&pAudioAttrs, 0);       
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pAudioType->CopyAllItems(pAudioAttrs);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the audio attributes on the profile.
    hr = pProfile->SetAudioAttributes(pAudioAttrs);
    if (FAILED(hr))
    {
        goto done;
    }

    // Set the container attributes.
    hr = MFCreateAttributes(&pContainer, 1);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pContainer->SetGUID(MF_TRANSCODE_CONTAINERTYPE, MFTranscodeContainerType_ASF);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = pProfile->SetContainerAttributes(pContainer);
    if (FAILED(hr))
    {
        goto done;
    }

    *ppProfile = pProfile;
    (*ppProfile)->AddRef();

done:
    SafeRelease(&pProfile);
    SafeRelease(&pAvailableTypes);
    SafeRelease(&pAudioType);
    SafeRelease(&pAudioAttrs);
    SafeRelease(&pContainer);
    return hr;
}

トランスコード API