다음을 통해 공유


제한되지 않는 가변 비트 전송률 인코딩

제한되지 않는 VBR(가변 비트 전송률) 인코딩 모드에서는 지정된 비트 속도를 유지하면서 콘텐츠가 가능한 최고 품질로 인코딩됩니다.

제한되지 않은 VBR 인코딩은 두 개의 인코딩 패스를 사용합니다. 제한되지 않은 VBR 인코딩을 사용하는 경우 상수 비트 속도 인코딩과 마찬가지로 스트림에 대한 비트 속도를 지정합니다. 그러나 인코더는 이 값을 스트림의 평균 비트 전송률로만 사용하고 평균을 유지하면서 품질이 가능한 한 높도록 인코딩합니다. 인코더에서 생성된 개별 샘플은 명시적 버퍼 제한 없이 크기가 달라집니다. 그러나 인코딩 세션 동안의 평균 비트 속도와 스트림의 기간은 사용자가 지정한 값에 지나지 않아야 합니다. 인코딩된 스트림의 모든 지점에서 실제 비트 속도는 평균 값과 크게 다를 수 있습니다. 제한되지 않은 VBR 인코딩에 대한 버퍼 창을 설정하지 않습니다. 대신 인코더는 인코딩된 샘플의 요구 사항에 따라 필요한 버퍼 창의 크기를 계산합니다. 즉, 평균 비트 속도가 설정한 값보다 작거나 같은 경우 스트림의 개별 샘플 크기에 제한이 없습니다.

제한되지 않은 VBR 인코딩의 이점은 예측 가능한 평균 대역폭 내에서 유지하면서 압축 스트림의 품질이 가장 높다는 것입니다. 대역폭을 지정해야 하지만 지정된 대역폭 주위의 변동이 허용되는 경우 이 값을 사용합니다. 예를 들어 로컬 파일 또는 다운로드 전용입니다.

이 인코딩 모드의 단점은 인코더가 인코딩 후 필요한 값으로 버퍼 창을 설정하여 버퍼 크기를 제어할 수 없다는 것입니다. 대부분의 경우 버퍼 크기 또는 대역폭 사용의 일관성에 대해 걱정하지 않는 경우 품질 기반 가변 비트 속도 인코딩을 사용해야 합니다.

제한되지 않은 VBR에 대한 인코더 구성

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

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

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

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

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

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

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_Unconstrained)
    {
        //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);
    }

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

ASF 인코딩 형식

새는 버킷 버퍼 모델

Two-Pass Windows 미디어 인코딩을 위한 토폴로지를 만드는 방법