未限制的變數位元速率編碼
在非限制的變數位元速率 (VBR) 編碼模式中,內容會編碼為最高可能的品質,同時維持指定的位元速率。
未受限制的 VBR 編碼會使用兩個編碼傳遞。 使用未受限制的 VBR 編碼時,您可以指定資料流程的位元速率,就像使用 常數位元速率編碼一樣。 不過,編碼器只會使用此值做為資料流程和編碼的平均位元速率,讓品質盡可能高,同時維持平均值。 編碼器所產生的個別樣本大小會有所不同,而不會有任何明確的緩衝區限制。 不過,編碼會話期間的平均位元速率和資料流程持續時間不能超過您指定的值。 編碼資料流程中任何時間點的實際位元速率可能會與平均值有很大的差異。 您不會為未受限制的 VBR 編碼設定緩衝區視窗。 相反地,編碼器會根據編碼樣本的需求來計算所需的緩衝區視窗大小。 這表示,只要平均位元速率小於或等於您設定的值,資料流程中的個別樣本大小就沒有任何限制。
未受限制的 VBR 編碼的優點是壓縮資料流程具有最高可能的品質,同時保持可預測的平均頻寬。 當您需要指定頻寬,但可接受所指定頻寬的波動時,請使用此功能;例如,針對本機檔案或僅下載。
此編碼模式的缺點是編碼器可以將緩衝區視窗設定為編碼之後所需的任何值,讓您無法控制緩衝區大小。 在大部分情況下,如果您不擔心緩衝區的大小或頻寬使用量的一致性,您應該使用 品質型變數位元速率編碼
設定未受限制 VBR 的編碼器
編碼器組態是透過屬性值來設定。 這些屬性定義于 wmcodecdsp.h 中。 在交涉輸出媒體類型之前,必須在編碼器上設定組態屬性。 如需如何在編碼器上設定屬性的詳細資訊,請參閱 設定編碼器。 根據指定的屬性值,您可以列舉支援的 VBR 輸出類型,並根據平均位元速率選取編碼器 Media Foundation Transform (MFT) 上所需的 VBR 輸出類型。
下列清單顯示您必須針對這種類型的編碼設定的屬性:
- 將 MFPKEY_VBRENABLED 屬性設定為 VARIANT_TRUE,以指定 VBR 編碼模式。
- 將MFPKEY_PASSESUSED設定為 2,因為未受限制的 VBR 模式會使用兩個編碼傳遞。
- 列舉輸出媒體類型時,請檢查音訊串流的 MF_MT_AUDIO_AVG_BYTES_PER_SECOND 屬性 () ,或 MF_MT_AVG_BITRATE屬性 ( ,以取得可用輸出媒體類型的視訊串流) 。 選擇輸出媒體類型,其平均位元速率最接近您想要編碼器在編碼內容中維護的平均位元速率。 如需選取輸出媒體類型的詳細資訊,請參閱 編碼器上的媒體類型交涉。
若要取得緩衝區視窗值是由編碼器設定,請在編碼會話之後呼叫 IWMCodecLeakyBucket::GetBufferSizeBits,定義于 wmcodecifaces.h 和 wmcodecdspuuid.lib 中。 若要新增資料流程不受限制的 VBR 支援,您必須在設定 ASF 設定檔時,在 MF_ASFSTREAMCONFIG_LEAKYBUCKET1屬性中 設定此值, (資料流程組態物件上的平均外泄值區值) 。
下列會修改範例類別 CEncoder 的 SetEncodingType 方法,以設定不受限制的 VBR 模式。 如需此類別的相關資訊,請參閱 編碼器範例程式碼。 如需此範例中使用的協助程式宏相關資訊,請參閱使用媒體基礎程式碼範例。
//////////////////////////////////////////////////////////////////////////
// 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;
}
相關主題