Настройка стандартной, Professional или кодировки звука без потери

Когда кодировщик мультимедиа Windows перечисляет типы выходных данных, он определяет каждый перечислимый тип как Стандартный, Professional или Без потерь. Вы можете определить, является ли тип выходных данных стандартным, Professional или без потерь, выполнив следующие действия.

  1. Вызов IMFTransform::GetOutputAvailableType для получения интерфейса IMFMediaType , представляющего тип вывода.
  2. Вызов IMFMediaType::GetRepresentation для получения AM_MEDIA_TYPE структуры, содержащей сведения о типе вывода.
  3. Элемент pbFormat структуры AM_MEDIA_TYPE указывает на структуру WAVEFORMATEX , содержащую дополнительные сведения о типе вывода. Проверьте член wFormatTag структуры WAVEFORMATEX . Значение 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. Задайте тип выходных данных для одного из типов, перечисленных на шаге 4, путем вызова IMFTransform::SetOutputType.

Следующий код перечисляет все типы выходных данных без потери для кодировщика звука Windows мультимедиа. Код выводит значение тега формата звука для каждого перечисленного типа. Так как все перечисленные типы не теряются, все эти теги формата имеют значение 0x163. Предположим, что pIMT является указателем на интерфейс IMFTransform в объекте Windows кодировщика мультимедиа мультимедиа и что 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                 
      }                                
   } 
}

Настройка кодирования звука