Standard、Professional、または Lossless オーディオ エンコードの構成

Windows Media Audio エンコーダーは、出力の種類を列挙するときに、列挙された各型を Standard、Professional、または Lossless として識別します。 次の手順を実行して、出力の種類が Standard、Professional、または Lossless のどちらであるかを判断できます。

  1. IMFTransform::GetOutputAvailableType を呼び出して、出力の種類を表す IMFMediaType インターフェイスを取得します。
  2. IMFMediaType::GetRepresentation を呼び出して、出力の種類に関する情報を含むAM_MEDIA_TYPE構造体を取得します。
  3. AM_MEDIA_TYPE構造体の pbFormat メンバーは、出力の種類に関する追加情報を含む WAVEFORMATEX 構造体を指します。 WAVEFORMATEX 構造体の wFormatTag メンバーを調べます。 0x161 の値は Standard を示し、0x162 の値は Professional を示し、0x163 の値はロスレスを示します。

出力の種類を列挙する前に Windows Media Audio エンコーダーでプロパティを設定した場合は、列挙する出力の種類の数を制限できます。 たとえば、VBR プロパティを適切に設定した場合、列挙された出力の種類を [ロスレス] カテゴリに含まれるものに制限できます。

標準オーディオ エンコード

次の手順を使用して、Standard オーディオ エンコードを構成できます。

  1. エンコーダーで任意のプロパティを設定します。
  2. 使用可能な出力の種類を列挙します。
  3. 列挙された型を調べて、オーディオ形式タグが 0x161 の型を選択します。
  4. IMFTransform::SetOutputType を呼び出して、選択した型に出力の種類を設定します。

プロフェッショナル オーディオ エンコード

次の手順を使用して、Professional オーディオ エンコードを構成できます。

  1. エンコーダーで任意のプロパティを設定します。
  2. 使用可能な出力の種類を列挙します。
  3. 列挙された型を調べて、オーディオ形式タグが 0x162 の型を選択します。
  4. IMFTransform::SetOutputType を呼び出して、選択した型に出力の種類を設定します。

ロスレス オーディオ エンコード

次の手順を使用して、ロスレス オーディオ エンコードを構成できます。

  1. MFPKEY_VBRENABLED プロパティを VARIANT_TRUE に設定します。
  2. MFPKEY_CONSTRAIN_ENUMERATED_VBRQUALITY プロパティを VARIANT_TRUE に設定します。
  3. MFPKEY_DESIRED_VBRQUALITY プロパティを 100 に設定します。
  4. 出力の種類を列挙します。
  5. IMFTransform::SetOutputType を呼び出して、出力の種類を手順 4 で列挙した型のいずれかに設定します。

次のコードは、Windows Media Audio エンコーダーのすべてのロスレス出力の種類を列挙します。 このコードは、列挙された各種類のオーディオ形式タグの値を出力します。 列挙されたすべての型はロスレスであるため、これらの書式タグはすべて 0x163 の値を持ちます。 pIMT が Windows Media Audio エンコーダー オブジェクトの IMFTransform インターフェイスへのポインターであり、pStore が同じオブジェクトの IPropertyStore インターフェイスへのポインターであるとします。 また、hr は、コードで以前に宣言された HRESULT 型の変数であると仮定します。

PROPVARIANT prop;
prop.vt = VT_BOOL;
prop.boolVal = VARIANT_TRUE;
hr = pStore->SetValue(MFPKEY_VBRENABLED, prop);

if(SUCCEEDED(hr))
{
   hr = pStore->SetValue(MFPKEY_CONSTRAIN_ENUMERATED_VBRQUALITY, prop);

   if(SUCCEEDED(hr))
   {
      prop.vt = VT_UI4;
      prop.ulVal = 100;
      hr = pStore->SetValue(MFPKEY_DESIRED_VBRQUALITY, prop);
      
      if(SUCCEEDED(hr))
      {           
         HRESULT hrAvailableType = S_OK;
         LONG j = 0;
         while(MF_E_NO_MORE_TYPES != hrAvailableType)
         {
            IMFMediaType* pOutputType = NULL;     
            hrAvailableType = pIMFT->GetOutputAvailableType(
               0, j, &pOutputType);

            if(SUCCEEDED(hrAvailableType))
            {
               AM_MEDIA_TYPE* pTypeRep = NULL;
               hr = pOutputType->GetRepresentation(
                  AM_MEDIA_TYPE_REPRESENTATION, (VOID**)&pTypeRep); 
                     
               if(SUCCEEDED(hr))
               {
                  WAVEFORMATEX* pwfex = (WAVEFORMATEX*)pTypeRep->pbFormat;
                  printf_s("%x\n", pwfex->wFormatTag);
                  pOutputType->FreeRepresentation(
                     AM_MEDIA_TYPE_REPRESENTATION, (VOID*)pTypeRep);
               }

               pOutputType->Release();
               ++j;
            }                                                                  
         } // while                 
      }                                
   } 
}

オーディオ エンコードの構成