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) 选择所需的类型。

必须为此类编码设置以下属性:

  • 通过将 MFPKEY_VBRENABLED 属性设置为 VARIANT_TRUE,指定 VBR 编码模式。
  • 将MFPKEY_PASSESUSED设置为 2,因为受峰值约束的 VBR 模式使用两个编码传递。
  • 设置MFPKEY_RMAX以指定峰值比特率,并设置MFPKEY_BMAX以指定峰值缓冲区窗口。
  • 枚举输出媒体类型时,检查音频流的MF_MT_AUDIO_AVG_BYTES_PER_SECOND属性 () 或视频流的MF_MT_AVG_BITRATE属性 () 可用输出媒体类型,并选择一种输出媒体类型,其平均比特率最接近希望编码器在编码内容中保持的所需平均比特率。 有关选择输出媒体类型的详细信息,请参阅 编码器上的媒体类型协商

注意

建议将峰值比特率设置为至少平均比特率的两倍。 将峰值速率设置为较低的值可能会导致编码器将内容编码为双传递 CBR,而不是峰值约束的 VBR。

 

若要获取编码器设置的缓冲区窗口值,请在编码会话后调用在 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 编码类型

泄漏的存储桶缓冲区模型

如何为Two-Pass Windows 媒体编码创建拓扑