Peak-Constrained Codierung mit variabler Bitrate
In der spitzenbeschränkten variablen Bitrate (VBR) wird der Inhalt mit einer angegebenen Bitrate und Spitzenwerten codiert: einer Spitzenbitrate und einem Spitzenpufferfenster. Diese Spitzenwerte werden auch als Peak Leaky Bucket-Werte bezeichnet. Die Datei wird so codiert, dass sie einem Puffer entspricht, der durch die Spitzenwerte beschrieben wird, sodass die durchschnittliche Bitrate des Datenstroms gleich oder kleiner als der von Ihnen angegebene durchschnittliche Bitratenwert ist.
In der Regel ist die Spitzenbitrate recht hoch. Der Encoder stellt sicher, dass der angegebene durchschnittliche Bitratenwert über die Dauer des Datenstroms beibehalten wird (durchschnittliche Bitrate >= (Gesamtdatenstromgröße in Bits /Streamdauer in Sekunden).) Betrachten Sie das folgende Beispiel: Sie konfigurieren einen Stream mit einer durchschnittlichen Bitrate von 16.000 Bit pro Sekunde, einer Spitzenbitrate von 48.000 Bit pro Sekunde und einem Spitzenpufferfenster von 3.000 (3 Sekunden). Die Größe des für den Datenstrom verwendeten Puffers beträgt 144.000 Bit (48.000 Bits pro Sekunde * 3 Sekunden), wie durch die Spitzenwerte bestimmt. Der Encoder komprimiert die Daten so, dass sie diesem Puffer entsprechen. Darüber hinaus muss die durchschnittliche Bitrate des Streams 16.000 oder weniger betragen. Wenn der Encoder große Stichproben erstellen muss, um ein komplexes Inhaltssegment zu verarbeiten, kann er die große Puffergröße nutzen. Andere Teile des Datenstroms müssen jedoch mit einer niedrigeren Bitrate codiert werden, um den Durchschnitt auf die angegebene Ebene zu senken. Die VBR-Codierung mit Spitzenbeschränkungen ist für Wiedergabegeräte mit begrenzter Pufferkapazität und Datenrateneinschränkungen nützlich. Ein häufiges Beispiel hierfür ist die Codierung, die für DVDs verwendet wird, wenn die Decodierung von einem Chip in einem Gerät ausgeführt wird, wobei Hardwareeinschränkungen berücksichtigt werden müssen.
Konfigurieren des Encoders für Peak-Constrained VBR
VbR mit Spitzeneinschränkung ähnelt nicht eingeschränktem VBR , da sie über die Dauer des Datenstroms auf eine durchschnittliche Bitrate beschränkt ist. Darüber hinaus entspricht VBR mit Spitzeneinschränkung einem Spitzenpuffer. Dieser Puffer wird mithilfe einer Spitzenbitrate und eines Spitzenpufferfensters beschrieben. Dieser Modus verwendet zwei Codierungsdurchläufe und bietet dem Encoder Flexibilität bei der Codierung einzelner Stichproben unter Einhaltung der Spitzenbeschränkungen.
Die Encoderkonfiguration wird über Eigenschaftswerte festgelegt. Diese Eigenschaften sind in wmcodecdsp.h definiert. Die Konfigurationseigenschaften müssen für den Encoder festgelegt werden, bevor der Ausgabemedientyp verhandelt wird. 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 basierend auf der durchschnittlichen Bitrate den erforderlichen Typ für die Media Foundation-Transformation (MFT ) des Encoders auswählen.
Sie müssen die folgenden Eigenschaften für diesen Codierungstyp festlegen:
- 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 VBR-Modus mit Spitzenbeschränkung zwei Codierungsdurchläufe verwendet.
- Legen Sie MFPKEY_RMAX fest, um die Spitzenbitrate anzugeben, und legen Sie MFPKEY_BMAX fest, um das Spitzenpufferfenster anzugeben.
- Überprüfen Sie beim Aufzählen des Ausgabemedientyps das MF_MT_AUDIO_AVG_BYTES_PER_SECOND-Attribut (für Audiodatenströme) oder das MF_MT_AVG_BITRATE-Attribut (für Videostreams) der verfügbaren Ausgabemedientypen, und wählen Sie einen Ausgabemedientyp mit der durchschnittlichen Bitrate aus, die der gewünschten durchschnittlichen Bitrate am nächsten kommt, die vom Encoder im codierten Inhalt beibehalten werden soll. Weitere Informationen zum Auswählen des Ausgabemedientyps finden Sie unter Medientypaushandlung auf dem Encoder.
Hinweis
Es wird empfohlen, die Spitzenbitrate auf mindestens das Doppelte der durchschnittlichen Bitrate festzulegen. Wenn Sie die Spitzenrate auf einen niedrigeren Wert festlegen, kann dies dazu führen, dass der Encoder den Inhalt als CBR mit zwei Durchlaufs codiert und nicht als spitzenbeschränkte VBR.
Um den vom Encoder festgelegten Pufferfensterwert abzurufen, rufen Sie nach der Codierungssitzung IWMCodecLeakyBucket::GetBufferSizeBits auf, definiert in wmcodecifaces.h, wmcodecdspuuid.lib. Um uneingeschränkte VBR-Unterstützung für die Streams hinzuzufügen, müssen Sie diesen Wert beim Konfigurieren des ASF-Profils im MF_ASFSTREAMCONFIG_LEAKYBUCKET2-Attribut (Peak Leaky Bucket Values) für das Streamkonfigurationsobjekt festlegen.
Im folgenden Codebeispiel wird die SetEncodingType-Methode der Beispielklasse CEncoder geändert, um den VBR-Modus mit Spitzenbeschränkung 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 peak-constrained VBR mode.
//
/////////////////////////////////////////////////////////////////////////
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_Peak)
{
// 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);
// Set the peak bit rate.
var.vt = VT_I4;
var.lVal =48000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_RMAX, var));
PropVariantClear(&var);
// Set the peak buffer window.
var.vt = VT_I4;
var.lVal =3000;
CHECK_HR(hr = pProp->SetValue(MFPKEY_BMAX, var));
PropVariantClear(&var);
}
done:
PropVariantClear(&var);
SAFE_RELEASE (pProp);
return hr;
}
Zugehörige Themen