Codifica della velocità in bit variabile Peak-Constrained
Nella frequenza di bit della variabile vincolata di picco (VBR), il contenuto viene codificato in base a una frequenza di bit e a valori di picco specificati: una frequenza di bit massima e una finestra del buffer di picco. Questi valori di picco sono detti anche valori bucket di perdita di picco. Il file viene codificato in modo che sia conforme a un buffer descritto dai valori di picco, in modo che la velocità media complessiva di bit del flusso sia uguale o inferiore al valore medio di velocità in bit specificato.
In genere, la frequenza 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 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 frequenza di bit massima di 48.000 bit al secondo e una finestra del 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) in base ai 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 di grandi dimensioni per gestire un segmento complesso di contenuto, può sfruttare le dimensioni del buffer di grandi dimensioni. Ma altre parti del flusso devono essere codificate a una velocità di bit inferiore per ridurre la media al livello specificato. La codifica VBR con vincoli di picco è utile per la riproduzione di dispositivi con capacità del buffer finito 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 è simile a VBR non vincolato, in quanto è limitato a una velocità in bit media per tutta la durata del flusso. Inoltre, la VBR con vincoli di picco è conforme a un buffer di picco. Questo buffer viene descritto usando una frequenza di bit massima e una finestra del buffer di picco. Questa modalità usa due passaggi di codifica e offre la flessibilità del codificatore per la codifica 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 richiesto nella trasformazione MFT ( Media Foundation ) del codificatore in base alla frequenza media di 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 vincolata di picco usa due passaggi di codifica.
- Impostare MFPKEY_RMAX per specificare la frequenza 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 frequenza media di bit 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 frequenza 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 bucket di 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 Codificatore Example Code. Per informazioni sulle macro helper usate in questo esempio, vedere Using the Media Foundation Code Examples.For information about the helper macro used in this example, see Using the Media Foundation Code Examples.
//////////////////////////////////////////////////////////////////////////
// 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