設定標準、專業或無遺失音訊編碼

當 Windows 媒體音訊編碼器列舉輸出類型時,它會將每個列舉類型識別為 Standard、Professional 或 Lossless。 您可以執行下列步驟來判斷輸出類型為 Standard、Professional 或 Lossless。

  1. 呼叫 IMFTransform::GetOutputAvailableType 以取得代表輸出類型的 IMFMediaType 介面。
  2. 呼叫 IMFMediaType::GetRepresentation 以取得包含輸出類型相關資訊 的AM_MEDIA_TYPE 結構。
  3. AM_MEDIA_TYPE結構的pbFormat成員會指向包含輸出類型其他資訊之「其」的「TBATEX」結構。 檢查其為「其」結構之 wFormatTag成員。 值0x161表示 Standard、0x162表示 Professional 的值,而 0x163 值表示「無遺失」。

如果您在列舉輸出類型之前,在 Windows Media Audio 編碼器上設定屬性,您可以限制列舉的輸出類型數目。 例如,如果您適當地設定 VBR 屬性,您可以將列舉的輸出類型限制為 [無遺失] 類別中的類型。

標準音頻編碼

您可以使用下列步驟來設定標準音頻編碼。

  1. 在編碼器上設定您選擇的屬性。
  2. 列舉可能的輸出類型。
  3. 檢查列舉型別,然後選擇具有音訊格式標籤的0x161類型。
  4. 呼叫 IMFTransform::SetOutputType,將輸出類型設定為您選擇的類型。

專業音訊編碼

您可以使用下列步驟來設定專業音訊編碼。

  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 媒體音訊編碼器物件上 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                 
      }                                
   } 
}

設定音訊編碼