다음을 통해 공유


Peak-Constrained 가변 비트 전송률 인코딩

피크 제한 VBR(가변 비트 전송률)에서 콘텐츠는 지정된 비트 전송률 및 피크 값(피크 비트 속도 및 피크 버퍼 창)으로 인코딩됩니다. 이러한 피크 값을 피크 누수 버킷 값이라고도 합니다. 파일은 스트림의 전체 평균 비트 전송률이 지정한 평균 비트 전송률 값과 같거나 작도록 피크 값으로 설명된 버퍼를 준수하도록 인코딩됩니다.

일반적으로 피크 비트 속도는 매우 높습니다. 인코더는 지정된 평균 비트 전송률 값이 스트림 기간 동안 유지되도록 합니다(평균 비트 전송률 >= (총 스트림 크기(비트/스트림 기간(초))). 다음 예제를 생각해 보세요. 평균 비트 전송률은 초당 16,000비트, 최고 비트 속도는 초당 48,000비트, 최대 버퍼 창은 3,000(3초)로 구성합니다. 스트림에 사용되는 버퍼의 크기는 최대 값에 따라 결정되는 144,000비트(초당 48,000비트 * 3초)입니다. 인코더는 해당 버퍼를 준수하도록 데이터를 압축합니다. 또한 스트림의 평균 비트 전송률은 16,000 이하여야 합니다. 인코더가 복잡한 콘텐츠 세그먼트를 처리하기 위해 큰 샘플을 만들어야 하는 경우 큰 버퍼 크기를 활용할 수 있습니다. 그러나 평균을 지정된 수준으로 낮추려면 스트림의 다른 부분을 더 낮은 비트 속도로 인코딩해야 합니다. 최대 제한 VBR 인코딩은 한정된 버퍼 용량 및 데이터 속도 제약 조건이 있는 재생 디바이스에 유용합니다. 이러한 일반적인 예는 디코딩이 디바이스의 칩에 의해 수행될 때 DVD에 사용되는 인코딩으로, 고려해야 하는 하드웨어 제한이 있습니다.

Peak-Constrained VBR에 대한 인코더 구성

피크 제한 VBR은 스트림 기간 동안 평균 비트 전송률로 제한된다는 측면에서 제한되지 않는 VBR 과 같습니다. 또한 피크 제한 VBR은 피크 버퍼를 준수합니다. 이 버퍼는 피크 비트 속도 및 피크 버퍼 창을 사용하여 설명합니다. 이 모드는 두 개의 인코딩 패스를 사용하며 최대 제한 사항을 준수하면서 개별 샘플을 인코딩하는 방법에 인코더 유연성을 제공합니다.

인코더 구성은 속성 값을 통해 설정됩니다. 이러한 속성은 wmcodecdsp.h에 정의됩니다. 출력 미디어 형식을 협상하기 전에 인코더에서 구성 속성을 설정해야 합니다. 인코더에서 속성을 설정하는 방법에 대한 자세한 내용은 인코더 구성을 참조하세요. 지정된 속성 값에 따라 지원되는 VBR 출력 형식을 열거하고 평균 비트 전송률에 따라 인코더 MFT( Media Foundation 변환 )에서 필요한 출력 형식을 선택할 수 있습니다.

이 유형의 인코딩에 대해 다음 속성을 설정해야 합니다.

  • MFPKEY_VBRENABLED 속성을 VARIANT_TRUE 설정하여 VBR 인코딩 모드를 지정합니다.
  • 피크 제한 VBR 모드는 두 개의 인코딩 패스를 사용하므로 MFPKEY_PASSESUSED 2로 설정합니다.
  • MFPKEY_RMAX 설정하여 최대 비트 속도를 지정하고 MFPKEY_BMAX 설정하여 최대 버퍼 창을 지정합니다.
  • 출력 미디어 형식을 열거하는 동안 사용 가능한 출력 미디어 형식의 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 특성(오디오 스트림의 경우) 또는 MF_MT_AVG_BITRATE 특성(비디오 스트림의 경우)을 검사 인코더가 인코딩된 콘텐츠에서 유지 관리하려는 평균 비트 속도와 가장 가까운 평균 비트 전송률을 포함하는 출력 미디어 형식을 선택합니다. 출력 미디어 형식을 선택하는 방법에 대한 자세한 내용은 인코더에서 미디어 형식 협상을 참조하세요.

참고

최고 비트 속도를 평균 비트 속도의 두 배 이상으로 설정하는 것이 좋습니다. 최고 속도를 더 낮은 값으로 설정하면 인코더가 피크 제한 VBR 대신 콘텐츠를 2-pass CBR로 인코딩할 수 있습니다.

 

인코더에서 설정한 버퍼 창 값을 얻으려면 인코딩 세션 후 wmcodecifaces.h, wmcodecdspuuid.lib에 정의된 IWMCodecLeakyBucket::GetBufferSizeBits를 호출합니다. 스트림에 대한 제한되지 않은 VBR 지원을 추가하려면 ASF 프로필을 구성하는 동안 스트림 구성 개체의 MF_ASFSTREAMCONFIG_LEAKYBUCKET2 특성(피크 새는 버킷 값)에서 이 값을 설정해야 합니다.

다음 코드 샘플에서는 샘플 클래스 CEncoder의 SetEncodingType 메서드를 수정하여 최대 제한 VBR 모드를 설정합니다. 이 클래스에 대한 자세한 내용은 인코더 예제 코드를 참조하세요. 이 예제에서 사용되는 도우미 매크로에 대한 자세한 내용은 미디어 파운데이션 코드 예제 사용을 참조하세요.

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////

HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
    if (!m_pMFT)
    {
        return MF_E_NOT_INITIALIZED;
    }

    HRESULT hr = S_OK;

    IPropertyStore* pProp = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    // Query the encoder for its property store.
    CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
    
    if (mode == EncodeMode_VBR_Peak)
    {
        // Set the VBR property to TRUE, which indicates VBR encoding.
        var.vt = VT_BOOL;
        var.boolVal = TRUE;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
        PropVariantClear(&var);

        // Set number of passes.
        var.vt = VT_I4;
        var.lVal  =2;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
        PropVariantClear(&var);

        // Set the peak bit rate.
        var.vt = VT_I4;
        var.lVal  =48000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
        PropVariantClear(&var);

        // Set the peak buffer window.
        var.vt = VT_I4;
        var.lVal  =3000;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
        PropVariantClear(&var);
    }

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

ASF 인코딩 형식

새는 버킷 버퍼 모델

Windows Media 인코딩을 Two-Pass 토폴로지를 만드는 방법