Peak-Constrained Codifica a Bitrate Variabile
Nella modalità a bit rate variabile vincolato (VBR), il contenuto viene codificato a un bit rate specificato e valori di picco: una velocità di bit di picco e una finestra di buffer di picco. Questi valori di picco sono detti anche valori del secchio a perdite. Il file viene codificato in modo da essere conforme a un buffer descritto dai valori di picco, in modo che la velocità di bit media complessiva del flusso sia uguale o inferiore al valore medio della velocità in bit specificata.
In genere, la velocità di bit di picco è piuttosto elevata. Il codificatore garantisce che il valore medio della velocità in bit specificato venga mantenuto per tutta la durata del flusso (velocità media dei bit >= (dimensioni totali del flusso in bit/durata del flusso in secondi)). Si consideri l'esempio seguente: si configura un flusso con una velocità media di bit di 16.000 bit al secondo, una velocità di bit massima di 48.000 bit al secondo e una finestra di buffer di picco di 3.000 (3 secondi). Le dimensioni del buffer usato per il flusso sono 144.000 bit (48.000 bit al secondo * 3 secondi) come determinato dai valori di picco. Il codificatore comprime i dati in modo che siano conformi a tale buffer. Inoltre, la velocità media dei bit del flusso deve essere pari o inferiore a 16.000. Se il codificatore deve creare campioni grandi per gestire un segmento complesso di contenuto, può sfruttare le dimensioni del grande buffer. Tuttavia, le altre parti del flusso devono essere codificate con una velocità di bit inferiore per ridurre la media al livello specificato. La codifica VBR con vincoli di picco è utile per la riproduzione dei dispositivi con una capacità di buffer limitata e vincoli di velocità dei dati. Un esempio comune è la codifica usata per i DVD quando la decodifica viene eseguita da un chip in un dispositivo, in cui è necessario considerare limitazioni hardware.
Configurazione del codificatore per Peak-Constrained VBR
VBR con vincoli di picco è come VBR non vincolato in quanto è limitato a una velocità di bit media per la durata del flusso. Inoltre, la VBR limitata al picco si adatta a un buffer di picco. Questo buffer viene descritto usando una frequenza di bit di picco e una finestra del buffer di picco. Questa modalità usa due passaggi di codifica e offre al codificatore flessibilità nella codificazione dei singoli campioni rispettando al tempo stesso le limitazioni di picco.
La configurazione del codificatore viene impostata tramite i valori delle proprietà. Queste proprietà sono definite in wmcodecdsp.h. Le proprietà di configurazione devono essere impostate sul codificatore prima di negoziare il tipo di supporto di output. Per informazioni su come impostare le proprietà nel codificatore, vedere Configurazione del codificatore. In base ai valori delle proprietà specificati, è possibile enumerare i tipi di output VBR supportati e selezionare quello necessario nel codificatore trasformazione Media Foundation (MFT) in base alla velocità media dei bit.
È necessario impostare le proprietà seguenti per questo tipo di codifica:
- Specificare la modalità di codifica VBR impostando la proprietà MFPKEY_VBRENABLED su VARIANT_TRUE.
- Impostare il MFPKEY_PASSESUSED su 2 perché la modalità VBR con vincoli di picco usa due passaggi di codifica.
- Impostare MFPKEY_RMAX per specificare la velocità di bit massima e impostare MFPKEY_BMAX per specificare la finestra del buffer di picco.
- Durante l'enumerazione del tipo di supporto di output, controllare l'attributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND (per i flussi audio) o l'attributo MF_MT_AVG_BITRATE (per i flussi video) dei tipi di supporti di output disponibili e scegliere un tipo di supporto di output con la velocità di bit media più vicina alla velocità media di bit desiderata che il codificatore deve mantenere nel contenuto codificato. Per altre informazioni sulla selezione del tipo di supporto di output, vedere Negoziazione del tipo di supporto nel codificatore.
Nota
È consigliabile impostare la velocità di bit massima su almeno due volte la velocità media dei bit. Se si imposta la frequenza di picco su un valore inferiore, il codificatore può codificare il contenuto come CBR a due passaggi anziché come VBR con vincoli di picco.
Per ottenere il valore della finestra del buffer impostato dal codificatore, chiamare IWMCodecLeakyBucket::GetBufferSizeBits, definito in wmcodecifaces.h, wmcodecdspuuid.lib, dopo la sessione di codifica. Per aggiungere il supporto VBR non vincolato per i flussi, è necessario impostare questo valore nell'attributo MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (valori di bucket con perdita di picco) nell'oggetto di configurazione del flusso durante la configurazione del profilo ASF.
Nell'esempio di codice seguente viene modificato il metodo SetEncodingType della classe di esempio CEncoder per configurare la modalità VBR con vincoli di picco. Per informazioni su questa classe, vedere codice di esempio del codificatore . Per informazioni sulle macro helper usate in questo esempio, vedere Uso degli esempi di codice di 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;
}
Argomenti correlati