配置标准、Professional或无损失音频编码

当Windows媒体音频编码器枚举输出类型时,它将每个枚举类型标识为“标准”、“Professional”或“丢失”。 可以通过执行以下步骤来确定输出类型是“标准”、“Professional”还是“无损失”。

  1. 调用 IMFTransform::GetOutputAvailableType 以获取表示输出类型的 IMFMediaType 接口。
  2. 调用 IMFMediaType::GetRepresentation 以获取包含有关输出类型的信息的 AM_MEDIA_TYPE 结构。
  3. AM_MEDIA_TYPE结构的 pbFormat 成员指向一个波形图X 结构,该结构包含有关输出类型的其他信息。 检查波形图X 结构的 wFormatTag 成员。 值0x161指示“标准”,0x162值表示Professional,0x163值表示“无损失”。

如果在枚举输出类型之前在 Windows Media Audio 编码器上设置属性,则可以限制枚举的输出类型数。 例如,如果适当地设置 VBR 属性,则可以将枚举输出类型限制为“无损失”类别中的输出类型。

标准音频编码

可以使用以下步骤配置标准音频编码。

  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                 
      }                                
   } 
}

配置音频编码