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

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

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

품질 기반 VBR 모드에서는 인코더가 수행 해야 하는 비트 전송률 또는 버퍼 창을 정의 하지 않습니다. 대신, 비트 전송률이 아닌 디지털 미디어 스트림의 품질 수준을 지정 합니다. 인코더는 모든 샘플의 품질을 비교할 수 있도록 콘텐츠를 압축 합니다. 이렇게 하면 결과 스트림의 버퍼 요구 사항에 관계 없이 재생 기간 동안 품질이 일관 되 게 유지 됩니다.

품질 기반 VBR 인코딩은 많은 양의 압축 된 스트림을 만드는 경향이 있습니다. 일반적으로이 유형의 인코딩은 로컬 재생 또는 고대역폭 네트워크 연결 (또는 다운로드 및 재생)에 적합 합니다. 예를 들어 응용 프로그램을 작성 하 여 CD의 곡을 컴퓨터의 ASF 파일로 복사할 수 있습니다. 품질 기반 VBR 인코딩을 사용 하면 복사 된 모든 노래가 동일한 품질을 유지할 수 있습니다. 이러한 경우 일관 된 품질은 사용자 환경을 향상 시킬 수 있습니다.

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

Quality-Based VBR 인코딩에 대 한 인코더 구성

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

다음 목록에서는 이러한 유형의 인코딩에 대해 설정 해야 하는 속성을 보여 줍니다.

  • MFPKEY _ vbrenabled 속성을 VARIANT TRUE로 설정 하 여 VBR 인코딩 모드를 지정 합니다 _ .
  • MFPKEY _ PASSESUSED 는 하나의 인코딩 패스를 사용 하기 때문에 1로 설정 합니다.
  • MFPKEY _ desired _ vbrquality 속성을 설정 하 여 원하는 품질 수준을 0에서 100으로 설정 합니다. 품질 기반 VBR은 미리 정의 된 버퍼 매개 변수로 콘텐츠를 인코딩하지 않습니다. 결과의 비트 전송률 요구 사항에 관계 없이 전체 스트림에 대해 유지 되는이 품질 수준입니다.
  • 비디오 스트림의 경우 인코더의 출력 미디어 유형에 서 MF _ MT _ AVG 비트 _ 전송률 특성에서 평균 비트 전송률을 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 인코딩 유형