Codifica della velocità in bit costante

Nella codifica CBR (Constant Bit Rate), il codificatore conosce la frequenza 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à di bit non è esattamente al valore specificato, ma rimane vicina alla velocità di bit di destinazione.

La codifica con velocità in bit costante risulta utile se si vuole conoscere la velocità in bit o la durata approssimativa di un file senza analizzare tutto il file. Ciò è necessario negli scenari di streaming live, in cui il contenuto multimediale deve essere trasmesso in streaming a una velocità in bit prevedibile con un uso uniforme 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 abbastanza 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 superiori 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 continuerà a variare, 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 dello scenario di recapito consentito.

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.

Per configurare il codificatore per la codifica CBR

  1. 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.

  2. Scegliere la velocità in bit di codifica.

    Per la codifica CBR, è necessario conoscere la velocità di bit con cui 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à media di bit più vicina alla velocità di bit di destinazione che si desidera 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 persi

Per la codifica CBR, i valori del bucket medio e massimo per il flusso sono gli stessi. Per altre informazioni su questi parametri, vedere Il modello di buffer di bucket persi.

Per codificare i flussi audio con codifica CBR, è necessario impostare i valori dei 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 dei bit impostata sul tipo di supporto di output.

Per impostare i 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.

Tipi di codifica ASF

Esercitazione: Codifica di Windows Media pass 1

Esercitazione: Scrittura di un file WMA tramite codifica CBR