상수 비트 전송률 인코딩

CBR(상수 비트 전송률) 인코딩에서 인코더는 인코딩 세션이 시작되기 전에 출력 미디어 샘플의 비트 속도와 버퍼 창(새는 버킷 매개 변수)을 알고 있습니다. 인코더는 동일한 수의 비트를 사용하여 파일 기간 동안 샘플의 각 초를 인코딩하여 스트림에 대한 대상 비트 속도를 달성합니다. 이렇게 하면 스트림 샘플의 크기 변동이 제한됩니다. 또한 인코딩 세션 동안 비트 전송률은 지정된 값에 정확히 해당하지 않지만 대상 비트 속도에 가깝게 유지됩니다.

CBR 인코딩은 전체 파일을 구문 분석하지 않고도 비트 전송률이나 대략적인 파일 재생 시간을 알고자 할 때 유용합니다. 미디어 일관적인 대역폭 사용량을 유지하며 예측 가능한 비트 전송률로 콘텐츠를 스트리밍해야 하는 라이브 스트리밍 시나리오에서 필수적입니다.

CBR 인코딩의 단점은 인코딩된 콘텐츠의 품질이 일정하지 않다는 것입니다. 일부 콘텐츠는 압축하기가 더 어렵기 때문에 CBR 스트림의 일부는 다른 콘텐츠보다 품질이 낮습니다. 예를 들어 일반적인 영화에는 상당히 정적인 일부 장면과 액션으로 가득찬 일부 장면이 있습니다. CBR을 사용하여 영화를 인코딩하는 경우 정적이며 효율적으로 인코딩하기 쉬운 장면은 동일한 품질을 유지하기 위해 더 높은 샘플 크기가 필요한 작업 장면보다 더 높은 품질이 됩니다.

일반적으로 CBR 파일의 품질 변형은 더 낮은 비트 속도로 더 두드러집니다. 비트 전송률이 높을수록 CBR로 인코딩된 파일의 품질은 계속 달라지지만 품질 문제는 사용자에게 덜 눈에 띄게 됩니다. CBR 인코딩을 사용하는 경우 배달 시나리오에서 허용하는 만큼 대역폭을 높게 설정해야 합니다.

CBR 구성 설정

인코딩 세션 전에 인코딩 유형 및 다양한 스트림별 설정을 지정하여 인코더를 구성해야 합니다.

CBR 인코딩에 대한 인코더를 구성하려면

  1. CBR 인코딩 모드를 지정합니다.

    기본적으로 인코더는 CBR 인코딩을 사용하도록 구성됩니다. 인코더 구성은 속성 값을 통해 설정됩니다. 이러한 속성은 wmcodecdsp.h에 정의됩니다. MFPKEY_VBRENABLED 속성을 VARIANT_FALSE 설정하여 이 모드를 명시적으로 지정할 수 있습니다. 인코더에서 속성을 설정하는 방법에 대한 자세한 내용은 인코더 구성을 참조하세요.

  2. 인코딩 비트 속도를 선택합니다.

    CBR 인코딩의 경우 인코딩 세션이 시작되기 전에 스트림을 인코딩하려는 비트 속도를 알고 있어야 합니다. 인코더를 구성하는 동안 비트 속도를 설정해야 합니다. 이렇게 하려면 미디어 형식 협상을 수행하는 동안 사용 가능한 출력 미디어 형식의 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 특성(오디오 스트림의 경우) 또는 MF_MT_AVG_BITRATE 특성(비디오 스트림의 경우)을 검사 달성하려는 대상 비트 전송률에 가장 가까운 평균 비트 전송률이 있는 출력 미디어 형식을 선택합니다. 자세한 내용은 인코더에 대한 미디어 형식 협상을 참조하세요.

다음 코드 예제에서는 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;
}

새는 버킷 설정

CBR 인코딩의 경우 스트림의 평균 및 최대 새는 버킷 값은 동일합니다. 이러한 매개 변수에 대한 자세한 내용은 새는 버킷 버퍼 모델을 참조하세요.

CBR 인코딩 오디오 스트림을 사용하려면 인코더에서 출력 미디어 형식을 협상한 후 새는 버킷 값을 설정해야 합니다. 인코더는 출력 미디어 형식에 설정된 평균 비트 전송률에 따라 내부적으로 버퍼 창을 계산합니다.

새는 버킷 값을 설정하려면 DWORD 배열을 만들어 미디어 싱크의 속성 저장소에 있는 MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET 속성에서 다음 값을 설정할 수 있습니다. 자세한 내용은 파일 싱크에서 속성 설정을 참조하세요.

ASF 인코딩 형식

자습서: 1-Pass Windows Media Encoding

자습서: CBR 인코딩을 사용하여 WMA 파일 작성