Codifica della velocità in bit variabile Quality-Based

A differenza della codifica CBR ( Constant Bit Rate Encoding ), in cui il codificatore cerca di mantenere una particolare velocità di bit del supporto codificato, nella modalità VBR (Variable Bit Rate), il codificatore si impegna a ottenere la migliore qualità possibile del supporto codificato. La differenza principale tra CBR e VBR è la dimensione della finestra del buffer usata. I flussi con codifica VBR in genere hanno finestre buffer di grandi dimensioni rispetto ai flussi con codifica CBR.

La qualità del contenuto codificato è determinata dalla quantità di dati persi quando il contenuto viene compresso. Molti fattori influiscono sulla perdita di dati nel processo di compressione; ma in generale, i dati originali più complessi e il rapporto di compressione più alto, più dettagli vengono persi nel processo di compressione.

In modalità VBR basata sulla qualità non si definisce una frequenza di bit o una finestra del buffer che il codificatore deve seguire. Specificare invece un livello di qualità per un flusso multimediale digitale anziché una velocità di bit. Il codificatore comprime il contenuto in modo che tutti i campioni siano di qualità paragonabile; ciò garantisce che la qualità sia coerente per tutta la durata della riproduzione, indipendentemente dai requisiti del buffer del flusso risultante.

La codifica VBR basata sulla qualità tende a creare flussi compressi di grandi dimensioni. In generale, questo tipo di codifica è ideale per la riproduzione locale o le connessioni di rete a larghezza di banda elevata (o scaricare e riprodurre). Ad esempio, è possibile scrivere un'applicazione per copiare brani da CD a file ASF in un computer. L'uso della codifica VBR basata sulla qualità garantisce che tutti i brani copiati siano della stessa qualità. In questi casi, la qualità coerente fornirà un'esperienza utente migliore.

Lo svantaggio della codifica VBR basata sulla qualità è che non esiste un modo per conoscere le dimensioni o i requisiti di larghezza di banda del supporto codificato prima della sessione di codifica, perché il codificatore usa un singolo passaggio di codifica. Ciò può rendere i file con codifica VBR di qualità inappropriati per le circostanze in cui la memoria o la larghezza di banda sono limitate, ad esempio la riproduzione di contenuti su lettori multimediali portatili o lo streaming su una rete a larghezza di banda ridotta.

Configurazione del codificatore per la codifica VBR Quality-Based

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.

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 1 perché questa modalità VBR usa un passaggio di codifica.
  • Impostare il livello di qualità desiderato (da 0 a 100) impostando la proprietà MFPKEY_DESIRED_VBRQUALITY . VBR basato sulla qualità non codifica il contenuto in alcun parametro del buffer predefinito. Questo livello di qualità che verrà mantenuto per l'intero flusso, indipendentemente dai requisiti di velocità in bit risultanti.
  • Per i flussi video, impostare la velocità media dei bit su un valore diverso da zero nell'attributo MF_MT_AVG_BITRATE sul tipo di supporto di output del codificatore. La frequenza dei bit accurata viene aggiornata al termine della sessione di codifica.

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;
}

Tipi di codifica ASF