Quality-Based Codierung mit variabler Bitrate

Im Gegensatz zur Codierung mit konstanter Bitrate (CBR), bei der der Encoder eine bestimmte Bitrate der codierten Medien beibehalten möchte, strebt der Encoder im VBR-Modus (Variable Bit Rate) die bestmögliche Qualität der codierten Medien an. Der Hauptunterschied zwischen CBR und VBR ist die Größe des verwendeten Pufferfensters. VBR-codierte Streams verfügen im Vergleich zu CBR-codierten Streams in der Regel über große Pufferfenster.

Die Qualität des codierten Inhalts wird durch die Menge an Daten bestimmt, die beim Komprimieren des Inhalts verloren gehen. Viele Faktoren wirken sich auf den Verlust von Daten im Komprimierungsprozess aus. Aber im Allgemeinen, je komplexer die Ursprünglichen Daten und je höher das Komprimierungsverhältnis, desto mehr Details gehen beim Komprimierungsprozess verloren.

Im qualitätsbasierten VBR-Modus definieren Sie keine Bitrate oder ein Pufferfenster, dem der Encoder folgen muss. Stattdessen geben Sie anstelle einer Bitrate ein Qualitätsniveau für einen digitalen Medienstream an. Der Encoder komprimiert den Inhalt, sodass alle Proben von vergleichbarer Qualität sind. Dadurch wird sichergestellt, dass die Qualität während der gesamten Wiedergabedauer konsistent ist, unabhängig von den Pufferanforderungen des resultierenden Datenstroms.

Die qualitätsbasierte VBR-Codierung erzeugt in der Regel große komprimierte Datenströme. Im Allgemeinen eignet sich diese Art der Codierung gut für lokale Wiedergabe oder Netzwerkverbindungen mit hoher Bandbreite (oder herunterladen und wiedergeben). Sie können beispielsweise eine Anwendung schreiben, um Songs von CD in ASF-Dateien auf einem Computer zu kopieren. Die Verwendung der qualitätsbasierten VBR-Codierung würde sicherstellen, dass alle kopierten Songs die gleiche Qualität aufweisen. In diesen Fällen sorgt die konsistente Qualität für eine bessere Benutzererfahrung.

Der Nachteil der qualitätsbasierten VBR-Codierung besteht darin, dass es wirklich keine Möglichkeit gibt, die Größen- oder Bandbreitenanforderungen der codierten Medien vor der Codierungssitzung zu kennen, da der Encoder einen einzelnen Codierungsdurchlauf verwendet. Dadurch können qualitätsbasierte VBR-codierte Dateien für Situationen ungeeignet sein, in denen Arbeitsspeicher oder Bandbreite eingeschränkt sind, z. B. die Wiedergabe von Inhalten auf tragbaren Medienplayern oder das Streamen über ein Netzwerk mit geringer Bandbreite.

Konfigurieren des Encoders für Quality-Based VBR-Codierung

Die Encoderkonfiguration wird über Eigenschaftswerte festgelegt. Diese Eigenschaften werden in wmcodecdsp.h definiert. Die Konfigurationseigenschaften müssen für den Encoder festgelegt werden, bevor sie den Ausgabemedientyp aushandeln. Informationen zum Festlegen von Eigenschaften für den Encoder finden Sie unter Konfigurieren des Encoders.

Die folgende Liste zeigt die Eigenschaften, die Sie für diesen Codierungstyp festlegen müssen:

  • Geben Sie den VBR-Codierungsmodus an, indem Sie die eigenschaft MFPKEY_VBRENABLED auf VARIANT_TRUE festlegen.
  • Legen Sie die MFPKEY_PASSESUSED auf 1 fest, da dieser VBR-Modus einen Codierungsdurchlauf verwendet.
  • Legen Sie die gewünschte Qualitätsstufe (von 0 auf 100) fest, indem Sie die eigenschaft MFPKEY_DESIRED_VBRQUALITY festlegen. Qualitätsbasierte VBR codiert den Inhalt nicht in vordefinierte Pufferparameter. Dieses Qualitätsniveau, das unabhängig von den sich daraus ergebenden Anforderungen an die Bitrate für den gesamten Stream beibehalten wird.
  • Legen Sie für Videostreams die durchschnittliche Bitrate im Attribut MF_MT_AVG_BITRATE für den Ausgabemedientyp des Encoders auf einen Wert ohne Zero fest. Die genaue Bitrate wird aktualisiert, nachdem die Codierungssitzung abgeschlossen ist.

Das folgende Codebeispiel zeigt die Implementierung für SetEncodingProperties. Diese Funktion legt Codierungseigenschaften auf Streamebene für CBR und VBR fest.

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

ASF-Codierungstypen