Peak-Constrained kódování proměnné bitové rychlosti
V proměnné VBR (Peak-Constrained Bit Rate) se obsah zakóduje do zadané přenosové rychlosti a hodnoty špičky: maximální přenosová rychlost a okno vyrovnávací paměti ve špičce. Tyto špičkové hodnoty se také nazývají hodnoty propustného kbelíku. Soubor je zakódován tak, aby odpovídal vyrovnávací paměti popsané vrcholovými hodnotami, takže celková průměrná bitová rychlost datového proudu je rovna nebo menší než vámi zadaná průměrná bitová rychlost.
Obvykle je špičková bitová rychlost poměrně vysoká. Kodér zajišťuje, aby byla zadaná průměrná hodnota přenosové rychlosti udržována v průběhu doby trvání datového proudu (průměrná bitová rychlost >= (celková velikost datového proudu v bitech / době trvání datového proudu v sekundách)). Představte si následující příklad: Nakonfigurujete datový proud s průměrnou přenosovou rychlostí 16 000 bitů za sekundu, maximální přenosovou rychlostí 48 000 bitů za sekundu a okno vyrovnávací paměti ve špičce 3 000 (3 sekundy). Velikost vyrovnávací paměti používané pro datový proud je 144 000 bitů (48 000 bitů za sekundu × 3 sekundy), jak je určeno maximálními hodnotami. Kodér komprimuje data tak, aby odpovídala této vyrovnávací paměti. Kromě toho musí být průměrná přenosová rychlost datového proudu 16 000 nebo menší. Pokud kodér musí vytvořit velké vzorky pro zpracování složitého segmentu obsahu, může využít velkou velikost vyrovnávací paměti. Ostatní části datového proudu však musí být kódovány nižší přenosovou rychlostí, aby se průměr snížil na zadanou úroveň. Kódování VBR s omezením ve špičce je užitečné pro přehrávací zařízení s omezenou kapacitou vyrovnávací paměti a omezenou přenosovou rychlostí dat. Běžným příkladem je kódování používané pro DVD při dekódování čipem v zařízení, kde je třeba zvážit hardwarová omezení.
Konfigurace kodéru pro Peak-Constrained VBR
VBR s omezením ve špičce se podobají neomezeným VBR v tom, že jsou omezeny na průměrnou přenosovou rychlost v průběhu doby trvání datového proudu. Kromě toho VBR s omezením ve špičce odpovídá vyrovnávací paměti ve špičce. Tato vyrovnávací paměť je popsaná pomocí přenosové rychlosti ve špičce a okna vyrovnávací paměti ve špičce. Tento režim používá dva průchody kódování a dává kodéru flexibilitu v tom, jak kóduje jednotlivé vzorky a současně dodržuje omezení špičky.
Konfigurace kodéru se nastavuje prostřednictvím hodnot vlastností. Tyto vlastnosti jsou definovány v wmcodecdsp.h. Před vyjednáváním typu výstupního média musí být u kodéru nastaveny vlastnosti konfigurace. Informace o tom, jak nastavit vlastnosti kodéru, naleznete v tématu Konfigurace kodéru. Na základě zadaných hodnot vlastností můžete vytvořit výčet podporovaných typů výstupu VBR a vybrat požadovaný typ v kodéru Media Foundation transform (MFT) na základě průměrné přenosové rychlosti.
Pro tento typ kódování musíte nastavit následující vlastnosti:
- Zadejte režim kódování VBR nastavením vlastnosti MFPKEY_VBRENABLED na VARIANT_TRUE.
- Nastavte MFPKEY_PASSESUSED na hodnotu 2, protože režim VBR s omezením ve špičce používá dva průchody kódování.
- Nastavte MFPKEY_RMAX pro určení maximální přenosové rychlosti a MFPKEY_BMAX pro určení maximálního okna vyrovnávací paměti.
- Při vytváření výčtu typu výstupního média zkontrolujte atribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (pro zvukové streamy) nebo atribut MF_MT_AVG_BITRATE (pro video streamy) dostupných typů výstupních médií a zvolte typ výstupního média, který má průměrnou přenosovou rychlost nejblíže požadované průměrné přenosové rychlosti, kterou má kodér udržovat v zakódovaném obsahu. Další informace o výběru typu výstupního média naleznete v tématu Vyjednávání typů médií v kodéru.
Poznámka
Doporučujeme nastavit maximální přenosovou rychlost alespoň na dvojnásobek průměrné přenosové rychlosti. Nastavení maximální rychlosti na nižší hodnotu může způsobit, že kodér kóduje obsah jako CBR s dvouprůchodovým režimem místo VBR omezeného na vrcholy.
Pokud chcete získat hodnotu okna vyrovnávací paměti nastavenou kodérem, zavolejte IWMCodecLeakyBucket::GetBufferSizeBits, definované ve wmcodecifaces.h, wmcodecdspuuid.lib, po skončení relace kódování. Pokud chcete přidat neomezenou podporu VBR pro datové proudy, musíte tuto hodnotu nastavit v atributu MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (hodnoty špičkového propustného koše) v objektu konfigurace datového proudu při konfiguraci profilu ASF.
Následující vzorový kód upraví Metodu SetEncodingType ukázkové třídy CEncoder tak, aby nastavila režim VBR s omezením ve špičce. Informace o této třídě viz příklad kódu kodéru. Informace o pomocných makrech použitých v tomto příkladu naleznete v tématu Použití příkladů kódu media foundation.
//////////////////////////////////////////////////////////////////////////
// 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;
}
Související témata