共用方式為


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 輸出類型,並根據平均比特率,在編碼器 Media Foundation 轉換 (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。

 

若要取得編碼器所設定的緩衝區視窗值,請在編碼會話之後呼叫 IWMCodecLeakyBucket::GetBufferSizeBits,該函數在 wmcodecifaces.h 和 wmcodecdspuuid.lib 中定義。 若要為數據流新增不受限制的 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 媒體編碼 建立拓撲