Quality-Based 가변 비트 전송률 인코딩

인코더가 인코딩된 미디어의 특정 비트 전송률을 유지하려고 하는 CBR(상수 비트 전송률 인코딩 )과 달리, 인코더는 VBR(가변 비트 전송률) 모드에서 인코딩된 미디어의 최상의 품질을 달성하기 위해 노력합니다. CBR과 VBR 간의 주요 차이점은 사용되는 버퍼 창의 크기입니다. VBR로 인코딩된 스트림은 일반적으로 CBR로 인코딩된 스트림에 비해 버퍼 창이 큽니다.

인코딩된 콘텐츠의 품질은 콘텐츠가 압축될 때 손실되는 데이터의 양에 따라 결정됩니다. 많은 요인이 압축 프로세스의 데이터 손실에 영향을 줍니다. 그러나 일반적으로 원래 데이터가 복잡할수록 압축 비율이 높을수록 압축 프로세스에서 더 많은 세부 정보가 손실됩니다.

품질 기반 VBR 모드에서는 인코더가 따라야 하는 비트 속도 또는 버퍼 창을 정의하지 않습니다. 대신 비트 전송률 대신 디지털 미디어 스트림의 품질 수준을 지정합니다. 인코더는 모든 샘플이 비슷한 품질을 갖도록 콘텐츠를 압축합니다. 이렇게 하면 결과 스트림의 버퍼 요구 사항에 관계없이 재생 기간 내내 품질이 일관됩니다.

품질 기반 VBR 인코딩은 큰 압축 스트림을 만드는 경향이 있습니다. 일반적으로 이러한 유형의 인코딩은 로컬 재생 또는 높은 대역폭 네트워크 연결(또는 다운로드 및 재생)에 적합합니다. 예를 들어 컴퓨터의 CD에서 ASF 파일로 노래를 복사하는 애플리케이션을 작성할 수 있습니다. 품질 기반 VBR 인코딩을 사용하면 복사된 모든 노래의 품질이 동일합니다. 이러한 경우 일관된 품질은 더 나은 사용자 환경을 제공합니다.

품질 기반 VBR 인코딩의 단점은 인코더가 단일 인코딩 패스를 사용하기 때문에 인코딩 세션 전에 인코딩된 미디어의 크기 또는 대역폭 요구 사항을 알 방법이 없다는 것입니다. 이렇게 하면 휴대용 미디어 플레이어에서 콘텐츠를 재생하거나 낮은 대역폭 네트워크를 통해 스트리밍하는 등 메모리 또는 대역폭이 제한된 상황에서 품질 기반 VBR로 인코딩된 파일이 부적절할 수 있습니다.

Quality-Based VBR 인코딩을 위한 인코더 구성

인코더 구성은 속성 값을 통해 설정됩니다. 이러한 속성은 wmcodecdsp.h에 정의됩니다. 출력 미디어 형식을 협상하기 전에 인코더에서 구성 속성을 설정해야 합니다. 인코더에서 속성을 설정하는 방법에 대한 자세한 내용은 인 코더 구성을 참조하세요.

다음 목록에는 이 유형의 인코딩에 대해 설정해야 하는 속성이 나와 있습니다.

  • MFPKEY_VBRENABLED 속성을 VARIANT_TRUE 설정하여 VBR 인코딩 모드를 지정합니다.
  • 이 VBR 모드는 하나의 인코딩 패스를 사용하므로 MFPKEY_PASSESUSED 1로 설정합니다.
  • MFPKEY_DESIRED_VBRQUALITY 속성을 설정하여 원하는 품질 수준(0에서 100까지)을 설정합니다. 품질 기반 VBR은 콘텐츠를 미리 정의된 버퍼 매개 변수로 인코딩하지 않습니다. 결과 비트 전송률 요구 사항에 관계없이 전체 스트림에 대해 유지 관리되는 이 품질 수준입니다.
  • 비디오 스트림의 경우 인코더의 출력 미디어 형식에 있는 MF_MT_AVG_BITRATE 특성의 평균 비트 속도를 0이 아닌 값으로 설정합니다. 인코딩 세션이 완료된 후 정확한 비트 전송률이 업데이트됩니다.

다음 코드 예제에서는 SetEncodingProperties에 대한 구현을 보여줍니다. 이 함수는 CBR 및 VBR에 대한 스트림 수준 인코딩 속성을 설정합니다.

//-------------------------------------------------------------------
//  SetEncodingProperties
//  Create a media source from a URL.
//
//  guidMT:  Major type of the stream, audio or video
//  pProps:  A pointer to the property store in which 
//           to set the required encoding properties.
//-------------------------------------------------------------------

HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
    if (!pProps)
    {
        return E_INVALIDARG;
    }

    if (EncodingMode == NONE)
    {
        return MF_E_NOT_INITIALIZED;
    }
   
    HRESULT hr = S_OK;

    PROPVARIANT var;

    switch (EncodingMode)
    {
        case CBR:
            // Set VBR to false.
            hr = InitPropVariantFromBoolean(FALSE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the video buffer window.
            if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        case VBR:
            //Set VBR to true.
            hr = InitPropVariantFromBoolean(TRUE, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Number of encoding passes is 1.

            hr = InitPropVariantFromInt32(1, &var);
            if (FAILED(hr))
            {
                goto done;
            }

            hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
            if (FAILED(hr))
            {
                goto done;
            }

            // Set the quality level.

            if (guidMT == MFMediaType_Audio)
            {
                hr = InitPropVariantFromUInt32(98, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            else if (guidMT == MFMediaType_Video)
            {
                hr = InitPropVariantFromUInt32(95, &var);
                if (FAILED(hr))
                {
                    goto done;
                }

                hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);    
                if (FAILED(hr))
                {
                    goto done;
                }
            }
            break;

        default:
            hr = E_UNEXPECTED;
            break;
    }    

done:
    PropVariantClear(&var);
    return hr;
}

ASF 인코딩 형식