Quality-Based Variable Bitrate Codierung

Im Gegensatz zur Konstanten-Bitrate-Codierung (CBR), bei der der Encoder versucht, eine bestimmte Bitrate der codierten Medien im Modus variabler Bitrate (VBR) zu erhalten, ist der Encoder bemüht, die bestmögliche Qualität der codierten Medien zu erreichen. Der primäre Unterschied zwischen CBR und VBR ist die Größe des verwendeten Pufferfensters. VBR-codierte Datenströme verfügen in der Regel über große Pufferfenster im Vergleich zu CBR-codierten Datenströme.

Die Qualität der codierten Inhalte wird durch die Menge der Daten bestimmt, die verloren gehen, wenn der Inhalt komprimiert wird. Viele Faktoren wirken sich auf den Datenverlust im Komprimierungsprozess aus; Aber im Allgemeinen gehen die ursprünglichen Daten und das höhere Komprimierungsverhältnis komplexer, das Detail geht im Komprimierungsprozess verloren.

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

Qualitätsbasierte VBR-Codierung tendiert dazu, große komprimierte Datenströme zu erstellen. Im Allgemeinen eignet sich diese Art der Codierung gut für lokale Wiedergabe- oder Hochbandbandnetzwerkverbindungen (oder herunterladen und wiedergeben). Sie können beispielsweise eine Anwendung schreiben, um Songs aus CD- und ASF-Dateien auf einem Computer zu kopieren. Mit der qualitätsbasierten VBR-Codierung wird sichergestellt, dass alle kopierten Songs von derselben Qualität sind. In diesen Fällen bietet die konsistente Qualität eine bessere Benutzererfahrung.

Der Nachteil der qualitätsbasierten VBR-Codierung besteht darin, dass es wirklich keine Möglichkeit gibt, die Größe oder Bandbreitenanforderungen der codierten Medien vor der Codierungssitzung zu kennen, da der Encoder einen einzigen Codierungspass verwendet. Dies kann qualitätsbasierte VBR-codierte Dateien für Umstände unangemessen machen, in denen Speicher oder Bandbreite eingeschränkt sind, z. B. das Wiedergeben von Inhalten auf tragbaren Medienplayern oder das Streaming über ein Netzwerk mit geringer Bandbreite.

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

Die Encoderkonfiguration wird über Eigenschaftenwerte festgelegt. Diese Eigenschaften werden in wmcodecdsp.h definiert. Die Konfigurationseigenschaften müssen auf dem Encoder festgelegt werden, bevor Sie den Ausgabemedientyp verhandeln. Informationen zum Festlegen von Eigenschaften auf dem 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 MFPKEY_VBRENABLED-Eigenschaft auf VARIANT_TRUE festlegen.
  • Legen Sie den MFPKEY_PASSESUSED auf 1 fest, da dieser VBR-Modus einen Codierungspass verwendet.
  • Legen Sie die gewünschte Qualitätsstufe (von 0 bis 100) fest, indem Sie die MFPKEY_DESIRED_VBRQUALITY-Eigenschaft festlegen. Qualitätsbasierte VBR codiert den Inhalt nicht mit vordefinierten Pufferparametern. Diese Qualitätsstufe, die für den gesamten Datenstrom beibehalten wird, unabhängig von den Bitratenanforderungen, die zu diesem Ergebnis führen.
  • Legen Sie für Videodatenströme die durchschnittliche Bitrate auf einen nichtzero-Wert im MF_MT_AVG_BITRATE-Attribut für den Ausgabemedientyp des Encoders fest. Die genaue Bitrate wird aktualisiert, nachdem die Codierungssitzung abgeschlossen ist.

Das folgende Codebeispiel zeigt die Implementierung für SetEncodingProperties. Diese Funktion legt die Codierungseigenschaften auf Datenstromebene 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