Codifica della velocità in bit costante
Nella codifica CBR (Constant Bit Rate), il codificatore conosce la velocità di bit dei campioni dei supporti di output e la finestra del buffer (parametri bucket persi) prima dell'inizio della sessione di codifica. Il codificatore usa lo stesso numero di bit per codificare ogni secondo di campione per tutta la durata del file per ottenere la velocità di bit di destinazione per un flusso. Ciò limita la variazione delle dimensioni dei campioni di flusso. Inoltre, durante la sessione di codifica la velocità in bit non è esattamente in corrispondenza del valore specificato, ma rimane vicina alla velocità in bit di destinazione.
La codifica CBR è utile quando si vuole conoscere la velocità di bit o la durata approssimativa di un file senza analizzare l'intero file. Questa operazione è necessaria negli scenari di streaming live in cui il contenuto multimediale deve essere trasmesso a una velocità di bit prevedibile e con un utilizzo coerente della larghezza di banda.
Lo svantaggio della codifica CBR è che la qualità del contenuto codificato non sarà costante. Poiché alcuni contenuti sono più difficili da comprimere, parti di un flusso CBR saranno di qualità inferiore rispetto ad altre. Ad esempio, un film tipico ha alcune scene piuttosto statiche e alcune scene piene di azione. Se si codifica un film con CBR, le scene statiche e quindi facili da codificare in modo efficiente saranno di qualità superiore rispetto alle scene d'azione, che avrebbero richiesto dimensioni di campionamento più elevate per mantenere la stessa qualità.
In generale, le variazioni nella qualità di un file CBR sono più pronunciate a velocità di bit inferiori. A velocità di bit più elevate, la qualità di un file con codifica CBR varia comunque, ma i problemi di qualità saranno meno evidenti per l'utente. Quando si usa la codifica CBR, è consigliabile impostare la larghezza di banda più elevata consentita dallo scenario di recapito.
Impostazioni di configurazione CBR
È necessario configurare un codificatore specificando il tipo di codifica e le varie impostazioni specifiche del flusso prima della sessione di codifica.
Configurare il codificatore per la codifica CBR
Specificare la modalità di codifica CBR.
Per impostazione predefinita, il codificatore è configurato per l'uso della codifica CBR. La configurazione del codificatore viene impostata tramite i valori delle proprietà. Queste proprietà sono definite in wmcodecdsp.h. È possibile specificare in modo esplicito questa modalità impostando la proprietà MFPKEY_VBRENABLED su VARIANT_FALSE. Per informazioni su come impostare le proprietà sui codificatori, vedere Configurazione del codificatore.
Scegliere la velocità in bit di codifica.
Per la codifica CBR, è necessario conoscere la velocità di bit in corrispondenza della quale si vuole codificare il flusso prima dell'inizio della sessione di codifica. È necessario impostare la velocità di bit durante la configurazione del codificatore. A tale scopo, durante l'esecuzione della negoziazione del tipo di supporto, 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à di bit di destinazione che si vuole ottenere. Per altre informazioni, vedere Negoziazione del tipo di supporto nel codificatore.
Nell'esempio di codice seguente viene illustrata l'implementazione di SetEncodingProperties. Questa funzione imposta le proprietà di codifica a livello di flusso per CBR e VBR.
//-------------------------------------------------------------------
// SetEncodingProperties
// Create a media source from a URL.
//
// guidMT: Major type of the stream, audio or video
// pProps: A pointer to the property store in which
// to set the required encoding properties.
//-------------------------------------------------------------------
HRESULT SetEncodingProperties (const GUID guidMT, IPropertyStore* pProps)
{
if (!pProps)
{
return E_INVALIDARG;
}
if (EncodingMode == NONE)
{
return MF_E_NOT_INITIALIZED;
}
HRESULT hr = S_OK;
PROPVARIANT var;
switch (EncodingMode)
{
case CBR:
// Set VBR to false.
hr = InitPropVariantFromBoolean(FALSE, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
if (FAILED(hr))
{
goto done;
}
// Set the video buffer window.
if (guidMT == MFMediaType_Video)
{
hr = InitPropVariantFromInt32(VIDEO_WINDOW_MSEC, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VIDEOWINDOW, var);
if (FAILED(hr))
{
goto done;
}
}
break;
case VBR:
//Set VBR to true.
hr = InitPropVariantFromBoolean(TRUE, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRENABLED, var);
if (FAILED(hr))
{
goto done;
}
// Number of encoding passes is 1.
hr = InitPropVariantFromInt32(1, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_PASSESUSED, var);
if (FAILED(hr))
{
goto done;
}
// Set the quality level.
if (guidMT == MFMediaType_Audio)
{
hr = InitPropVariantFromUInt32(98, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_DESIRED_VBRQUALITY, var);
if (FAILED(hr))
{
goto done;
}
}
else if (guidMT == MFMediaType_Video)
{
hr = InitPropVariantFromUInt32(95, &var);
if (FAILED(hr))
{
goto done;
}
hr = pProps->SetValue(MFPKEY_VBRQUALITY, var);
if (FAILED(hr))
{
goto done;
}
}
break;
default:
hr = E_UNEXPECTED;
break;
}
done:
PropVariantClear(&var);
return hr;
}
Impostazioni bucket perse
Per la codifica CBR, i valori medi e massimi del bucket persa per il flusso sono gli stessi. Per altre informazioni su questi parametri, vedere Il modello di buffer bucket di perdita.
Per codificare i flussi audio con codifica CBR, è necessario impostare i valori di bucket persi dopo aver negoziato il tipo di supporto di output nel codificatore. Il codificatore calcola internamente la finestra del buffer in base alla velocità media di bit impostata sul tipo di supporto di output.
Per impostare valori bucket persi, creare una matrice di DWORD può impostare i valori seguenti nella proprietà MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET nell'archivio delle proprietà del sink multimediale. Per altre informazioni, vedere Impostazione delle proprietà nel sink di file.
- Velocità media dei bit: ottiene la velocità media dei bit dal tipo di supporto di output selezionato durante la negoziazione del tipo di supporto. Usare l'attributo MF_MT_AUDIO_AVG_BYTES_PER_SECOND.
- Finestra buffer: eseguire una query sul codificatore per l'interfaccia IWMCodecLeakyBucket e quindi chiamare interfaccia IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib).
- Dimensioni iniziali del buffer: impostata su 0.
Argomenti correlati
-
Esercitazione : Codifica di Windows Media da 1 passaggio
-
esercitazione : Scrittura di un file WMA con codifica CBR