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 轉換 上選取所需的 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。
若要取得編碼器所設定的緩衝區視窗值,請在編碼會話之後呼叫 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;
}
相關主題