Codifica della frequenza di bit delle variabili non vincolate
In modalità di codifica VBR (Unconstrained Variable Bit Rate), il contenuto viene codificato con la massima qualità possibile mantenendo una velocità di bit specificata.
La codifica VBR non vincolata usa due passaggi di codifica. Quando si usa la codifica VBR non vincolata, si specifica una velocità di bit per il flusso, come si farebbe con la codifica della velocità in bit costante. Tuttavia, il codificatore usa questo valore solo come velocità media di bit per il flusso e codifica in modo che la qualità sia il più elevata possibile mantenendo la media. I singoli campioni prodotti dal codificatore variano in base alle dimensioni senza limiti espliciti del buffer. Tuttavia, la velocità media dei bit durante la sessione di codifica e la durata del flusso non devono essere più del valore specificato dall'utente. La velocità effettiva dei bit in qualsiasi punto del flusso codificato può variare notevolmente rispetto al valore medio. Non si imposta una finestra del buffer per la codifica VBR senza vincoli. Il codificatore calcola invece le dimensioni della finestra del buffer necessaria in base ai requisiti degli esempi codificati. Ciò significa che non esiste alcun limite alle dimensioni dei singoli campioni nel flusso, purché la velocità media dei bit sia minore o uguale al valore impostato.
Il vantaggio della codifica VBR non vincolata è che il flusso compresso ha la massima qualità possibile pur rimanendo all'interno di una larghezza di banda media prevedibile. Usare questa opzione quando è necessario specificare una larghezza di banda, ma le fluttuazioni intorno alla larghezza di banda specificata sono accettabili; ad esempio per i file locali o solo per il download.
Lo svantaggio di questa modalità di codifica è che il codificatore può impostare la finestra del buffer su qualsiasi valore richiesto dopo la codifica, senza alcun controllo sulle dimensioni del buffer. Nella maggior parte dei casi, se non si è interessati alle dimensioni del buffer o alla coerenza dell'utilizzo della larghezza di banda, è consigliabile usare la codifica della velocità di bit variabile basata sulla qualità
Configurazione del codificatore per VBR non vincolato
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 nel codificatore Media Foundation Transform (MFT) in base alla frequenza media di bit.
L'elenco seguente mostra le proprietà che è necessario impostare 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 non vincolata usa due passaggi di codifica.
- 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. Scegliere un tipo di supporto di output con la velocità media di bit più vicina alla velocità media di bit desiderata che il codificatore mantenga nel contenuto codificato. Per altre informazioni sulla selezione del tipo di supporto di output, vedere Negoziazione del tipo di supporto nel codificatore.
Per ottenere il valore della finestra del buffer viene impostato dal codificatore, chiamare IWMCodecLeakyBucket::GetBufferSizeBits, definito in wmcodecifaces.h e 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_LEAKYBUCKET1 (valori di bucket persi medi) nell'oggetto di configurazione del flusso durante la configurazione del profilo ASF.
Di seguito viene modificato il metodo SetEncodingType della classe di esempio CEncoder per configurare la modalità VBR senza vincoli. 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 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;
}
Argomenti correlati