Codierung mit nicht eingeschränkter variabler Bitrate

Im Codierungsmodus mit nicht eingeschränkter variabler Bitrate (VBR) wird der Inhalt unter Beibehaltung einer angegebenen Bitrate in höchstmöglicher Qualität codiert.

Die nicht eingeschränkte VBR-Codierung verwendet zwei Codierungsdurchläufe. Wenn Sie eine nicht eingeschränkte VBR-Codierung verwenden, geben Sie eine Bitrate für den Stream an, wie es bei der Codierung mit konstanter Bitrate der Fall wäre. Der Encoder verwendet diesen Wert jedoch nur als die durchschnittliche Bitrate für den Stream und codiert, damit die Qualität so hoch wie möglich ist, während der Durchschnitt beibehalten wird. Einzelne vom Encoder erzeugte Beispiele variieren in der Größe ohne explizite Puffergrenzwerte. Die durchschnittliche Bitrate während der Codierungssitzung und die Dauer des Datenstroms dürfen jedoch nicht mehr als den von Ihnen angegebenen Wert betragen. Die tatsächliche Bitrate an einem beliebigen Punkt des codierten Datenstroms kann stark vom Durchschnittswert abweichen. Sie legen kein Pufferfenster für die nicht eingeschränkte VBR-Codierung fest. Stattdessen berechnet der Encoder die Größe des erforderlichen Pufferfensters basierend auf den Anforderungen der codierten Beispiele. Dies bedeutet, dass die Größe einzelner Stichproben im Stream nicht begrenzt ist, solange die durchschnittliche Bitrate kleiner oder gleich dem von Ihnen festgelegten Wert ist.

Der Vorteil der nicht eingeschränkten VBR-Codierung besteht darin, dass der komprimierte Stream die höchstmögliche Qualität aufweist und gleichzeitig innerhalb einer vorhersagbaren durchschnittlichen Bandbreite bleibt. Verwenden Sie dies, wenn Sie eine Bandbreite angeben müssen, aber Schwankungen um die angegebene Bandbreite akzeptabel sind. z. B. für lokale Dateien oder nur für downloads.

Der Nachteil dieses Codierungsmodus besteht darin, dass der Encoder das Pufferfenster auf den wert festlegen kann, der nach der Codierung erforderlich ist, sodass Sie keine Kontrolle über die Puffergröße haben. Wenn Sie sich in den meisten Fällen keine Gedanken über die Größe des Puffers oder die Konsistenz der Bandbreitennutzung machen, sollten Sie qualitätsbasierte Codierung variabler Bitraten verwenden.

Konfigurieren des Encoders für nicht eingeschränkte VBR

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. Basierend auf den angegebenen Eigenschaftswerten können Sie die unterstützten VBR-Ausgabetypen auflisten und den erforderlichen für den Encoder Media Foundation Transform (MFT) basierend auf der durchschnittlichen Bitrate auswählen.

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 2 fest, da der nicht eingeschränkte VBR-Modus zwei Codierungsdurchläufe verwendet.
  • Überprüfen Sie beim Auflisten des Ausgabemedientyps das Attribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (für Audiostreams) oder das attribut MF_MT_AVG_BITRATE (für Videostreams) der verfügbaren Ausgabemedientypen. Wählen Sie einen Ausgabemedientyp mit der durchschnittlichen Bitrate aus, die der gewünschten durchschnittlichen Bitrate am nächsten kommt, die der Encoder im codierten Inhalt beibehalten soll. Weitere Informationen zum Auswählen des Ausgabemedientyps finden Sie unter Medientypaushandlung auf dem Encoder.

Um den Wert des Pufferfensters vom Encoder zu erhalten, rufen Sie nach der Codierungssitzung IWMCodecLeakyBucket::GetBufferSizeBits auf, definiert in wmcodecifaces.h und wmcodecdspuuid.lib. Um nicht eingeschränkte VBR-Unterstützung für die Streams hinzuzufügen, müssen Sie diesen Wert beim Konfigurieren des ASF-Profils im Attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (durchschnittliche Werte für undichte Buckets) für das Streamkonfigurationsobjekt festlegen.

Im Folgenden wird die SetEncodingType-Methode der Beispielklasse CEncoder geändert, um den nicht eingeschränkten VBR-Modus einzurichten. Informationen zu dieser Klasse finden Sie unter Encoder-Beispielcode. Informationen zu den in diesem Beispiel verwendeten Hilfsmakros finden Sie unter Verwenden der Media Foundation-Codebeispiele.

//////////////////////////////////////////////////////////////////////////
//  Name: SetEncodingType
//  Description: Sets the encoding type to unconstrained VBR
//
/////////////////////////////////////////////////////////////////////////

HRESULT CEncoder::SetEncodingType(EncodeMode mode)
{
    if (!m_pMFT)
    {
        return MF_E_NOT_INITIALIZED;
    }

    HRESULT hr = S_OK;

    IPropertyStore* pProp = NULL;

    PROPVARIANT var;
    PropVariantInit(&var);

    //Query the encoder for its property store
    CHECK_HR(hr = m_pMFT->QueryInterface(__uuidof(IPropertyStore), (void**)&pProp));
    
    if (mode == EncodeMode_VBR_Unconstrained)
    {
        //Set the VBR property to TRUE, which indicates VBR encoding
        var.vt = VT_BOOL;
        var.boolVal = TRUE;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_VBRENABLED, var));
        PropVariantClear(&var);

        //Set number of passes
        var.vt = VT_I4;
        var.lVal  =2;
        CHECK_HR(hr = pProp->SetValue(MFPKEY_PASSESUSED, var));
        PropVariantClear(&var);
    }

done:
    PropVariantClear(&var);
    SAFE_RELEASE (pProp);
    return hr;
    
}

ASF-Codierungstypen

Das Puffermodell für undichte Buckets

Erstellen einer Topologie für Two-Pass Windows Media-Codierung