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;
}
相關主題