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

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の値は Lossless を示します。

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

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

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

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

Professional オーディオ エンコード

次の手順を使用して、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 メディア オーディオ エンコーダーのすべての損失のない出力の種類を列挙します。 このコードは、列挙された種類ごとにオーディオ形式タグの値を出力します。 列挙された型はすべてロスレスであるため、これらのすべての書式タグの値は 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                 
      }                                
   } 
}

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