표준, Professional 또는 무손실 오디오 인코딩 구성

Windows Media Audio 인코더가 출력 형식을 열거하면 열거된 각 형식을 표준, Professional 또는 무손실 형식으로 식별합니다. 다음 단계를 수행하여 출력 형식이 표준, Professional 또는 무손실인지 여부를 확인할 수 있습니다.

  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 속성을 적절하게 설정하는 경우 열거된 출력 형식을 무손실 범주에 있는 출력 형식으로 제한할 수 있습니다.

표준 오디오 인코딩

다음 단계를 사용하여 표준 오디오 인코딩을 구성할 수 있습니다.

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

오디오 인코딩 구성