Das Leaky Bucket-Puffermodell (Microsoft Media Foundation)
Wenn Sie Medien über ein Netzwerk streamen, empfängt der Decoder codierte Daten mit einer theoretisch konstanten Rate (der Übertragungsrate). Der Decoder nutzt diese Daten, um eine decodierte Ausgabe zu erzeugen. Im Allgemeinen nutzt der Decoder die Daten jedoch mit einer variablen Rate, da dann der Encoder eine variable Codierungsrate verwenden kann.
Das Modell "Leaky Bucket" ist eine Möglichkeit, die Pufferanforderungen für eine reibungslose Wiedergabe zu modellieren. In diesem Modell verwaltet der Decoder einen Puffer. Codierte Daten werden aus dem Netzwerk in den Puffer und aus dem Puffer in den Decoder übertragen. Wenn der Puffer unterläuft, bedeutet dies, dass der Decoder Daten schneller aus dem Puffer entfernt, als das Netzwerk sie liefert. Wenn der Puffer überläuft, bedeutet dies, dass das Netzwerk Daten schneller liefert, als der Decoder sie verbraucht.
In diesem Thema wird das Modell von Puffern für das Codieren und Decodieren beschrieben.
- Der undichte Bucket
- Der verwendete Bucket
- Festlegen von undichten Bucketwerten für ASF-Streams
- Undichte Bucketwerte im ASF-Multiplexer
- Aktualisieren von undichten Bucketwerten in der ASF-Mediensenke
- Zugehörige Themen
Der undichte Bucket
Um das undichte Bucket-Modell zu verstehen, betrachten Sie einen Bucket mit einem kleinen Loch am unteren Rand. Drei Parameter definieren den Bucket:
- Die Kapazität (B)
- Die Geschwindigkeit, mit der Wasser aus dem Eimer fließt (R)
- Die anfängliche Füllfülle des Buckets (F)
In dieser Metapher ist der Bucket der Puffer:
Wenn Wasser genau mit der Rate R in den Eimer gegossen wird, bleibt der Eimer bei F, da die Eingaberate der Ausgaberate entspricht. Wenn die Eingaberate zunimmt, während R konstant bleibt, sammelt der Eimer Wasser an. Wenn die Eingaberate für einen dauerhaften Zeitraum größer als R ist, überläuft der Bucket schließlich. Die Eingaberate kann jedoch um R variieren, ohne den Bucket zu überlaufen, solange die durchschnittliche Eingaberate die Kapazität des Buckets nicht überschreitet. Je größer die Kapazität, desto mehr kann die Eingaberate innerhalb eines bestimmten Zeitfensters variieren.
In ASF wird der undichte Bucket durch drei Parameter definiert:
- Die durchschnittliche Bitrate in Bytes pro Sekunde, die der Ausgaberate (R) entspricht.
- Das Pufferfenster, gemessen in Millisekunden, das der Bucketkapazität (B) entspricht.
- Die anfängliche Pufferfülle, die in der Regel auf 0 festgelegt ist.
Die Bitrate misst die durchschnittliche Anzahl von Bits pro Sekunde im codierten Stream. Das Pufferfenster misst die Anzahl von Millisekunden von Daten mit dieser Bitrate, die in den Puffer passen kann. Die Größe des Puffers in Bits entspricht R * (B / 1000).
ASF-Nutzlastdaten können zu unregelmäßigen Zeiten und in unregelmäßigen Mengen in den undichten Bucket gelangen, müssen den Bucket jedoch mit einer konstant positiven Bitrate verlassen. Aufgrund des Pufferfensters gibt es eine mögliche Verzögerung zwischen dem Zeitpunkt, zu dem die Nutzlast in den Bucket gelangt, und dem Zeitpunkt, an dem sie sich verlässt. Die maximale Verzögerung, die auftreten kann, ist B/R. Die Nutzlastdaten, die in den Bucket eingegeben werden, sind entsprechend der Präsentationszeit und dürfen den Bucket niemals überlaufen. Zusätzlich zur Präsentationszeit verfügt jede Nutzlast auch über eine Sendezeit – die Zeit, zu der die Nutzlastdaten den Bucket gemäß der Bitrate verlassen. Die Sendezeit muss früher als die Präsentationszeit liegen, um sicherzustellen, dass jede Nutzlast den Bucket vor oder zur Präsentationszeit verlässt, wenn der undichte Bucket fast voll ist. Um dies zu erreichen, werden die Präsentationszeiten durch den B/R-Wert (das Preroll) nach vorne verschoben, und die Sendezeiten erhalten einen Vorsprung ab 00. Die Sendezeit darf nicht später als die Präsentationszeit sein, da dies darauf hindeutet, dass die Nutzlast zu spät in den Bucket gelangt ist und nicht in das Datenobjekt eingeschlossen werden kann. Der Prerollwert ist im ASF-Headerobjekt enthalten.
Für das glitchfreie Streaming über das Netzwerk müssen komprimierte Streams innerhalb des Medieninhalts eine konstante Bitrate während der Wiedergabedauer beibehalten. Das ASF-Leaky-Bucket-Modell stellt sicher, dass Mediendaten mit konstanter Bitrate über das Netzwerk gesendet werden. Die Parameter des undichten Buckets werden im Objekt Für erweiterte Streameigenschaften des ASF-Headerobjekts angegeben. In Microsoft Media Foundation werden sie als Attribute für den Medientyp festgelegt, der den Stream darstellt.
Die Werte des undichten Buckets werden sowohl in der ASF-Dateisenke als auch im zugrunde liegenden ASF-Multiplexerobjekt sowie im Windows Media-Encoder definiert. Diese Werte können identisch oder unterschiedlich sein. Betrachten Sie beispielsweise ein Streamingszenario, bei dem die Audiobeispiele später als die Videobeispiele übermittelt werden müssen, damit die Datei ohne Wartezeit gestreamt werden kann. Um dies zu erreichen, kann der undichte Bucket des Audiostreams in der Mediensenke auf einen Wert höher als der im Windows Media-Audioencoder festgelegte Wert festgelegt werden.
Um B/R-Werte im Encoder festzulegen, muss die Anwendung die Eigenschaften MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX und MFPKEY_BMAX festlegen. Informationen zum Festlegen von Eigenschaften im Encoder finden Sie unter Codierungseigenschaften.
Der verwendete Bucket
Das Ziel eines Encoders besteht darin, sicherzustellen, dass der Inhalt den Puffer nie überläuft. Der Encoder verwendet die Werte der Bitrate und des Pufferfensters als Leitlinien. Die tatsächliche Anzahl von Bits, die über einen beliebigen Zeitraum übergeben werden, der dem Pufferfenster entspricht, darf nie größer als das Doppelte der Größe des Puffers sein.
Betrachten Sie das folgende Beispiel: Sie haben einen 3-Gallonen-Bucket mit einem Loch, durch das 1 Gallone pro Minute fließen kann. Sie legen den Eimer unter einen Spigot und öffnen das Ventil, um Wasser mit einer Rate von 1 Gallone pro Minute herauszulassen. Das Wasser fließt so schnell aus dem Eimer, wie es eindringt, und hinterlässt kein Zusätzliches im Eimer. Dann erhöhen Sie den Fluss vom Spigot auf 2 Gallonen pro Minute. Jede Minute, in der das Wasser mit dieser Geschwindigkeit fließt, gehen 2 Gallonen in den Eimer und 1 Gallone tritt aus, sodass 1 Gallone im Eimer bleibt. Am Ende von 3 Minuten sind 6 Gallonen Wasser in den Eimer gegangen, 3 Gallonen sind ausgelaufen, und der Eimer ist voll.
In der Praxis wird die theoretische maximale Datenrate über ein Intervall, das dem Pufferfenster entspricht, nie erreicht. Im vorherigen Beispiel wurde eine konstante Datenrate angenommen. Mit dem gleichen 3-Gallonen-Eimer könnten Sie die Flussrate vom Spigot für eine Minute auf 6 Gallonen pro Minute erhöhen und dann den Spigot für zwei Minuten ausschalten. Obwohl die gesamt in den Eimer gesteckte Wassermenge innerhalb des theoretischen Maximums für das Pufferfenster liegt, führt die Konzentration dieser Menge in einem Teil des Fensters dazu, dass der Eimer überläuft. Mit 6 Gallonen pro Minute überläuft der 3-Gallonen-Eimer kurz nach 30 Sekunden. Daher hängt die tatsächliche maximale Datenmenge, die über die Dauer eines beliebigen Intervalls an den Puffer übermittelt werden kann, das der Pufferfenstereinstellung entspricht, von der Größe der einzelnen Stichproben und dem Zeitpunkt der Übermittlung ab.
Bisher wurde in den Beispielen nur der vom Decoder verwendete Puffer erläutert, aber ein undichter Bucketpuffer wird auch vom Encoder verwendet, der den komprimierten Inhalt erstellt. Der Encoder nimmt alle erforderlichen Anpassungen an den Komprimierungsalgorithmen vor, um die Bitrate der komprimierten Proben innerhalb der durch das Bitrate- und Pufferfenster beschriebenen Grenzen zu halten, wobei vorausgesetzt wird, dass die Samples mit konstanter Rate an den Decoder übermittelt werden. Sie können sich den Encoder-Bucket als Spiegelung des Decoder-Buckets vorstellen. Der Encoder-Bucket wird mit einer variablen Rate gefüllt, die von der Größe der einzelnen Proben bestimmt wird, und Lecks mit einer konstanten Rate, die der durchschnittlichen Bitrate entspricht.
Betrachten Sie das folgende Beispiel für einen Encoder und einen Decoder, der über ein Netzwerk miteinander verbunden ist. Sie codieren eine Videodatei mit 30 Frames pro Sekunde mit einer Bitrate von 6.000 Bit pro Sekunde und einem Pufferfenster von 3 Sekunden (eine Puffergröße von insgesamt 18.000 Bits). Das erste Beispiel ist als Keyframe codiert und nimmt 7.000 Bits in Anspruch. Der Encoderpuffer enthält jetzt 7.000 Bits. Die nächsten 29 Frames sind alle Deltaframes mit insgesamt 3.000 Bit. Die erste Sekunde des Inhalts (30 Frames) würde also die Pufferfülle auf 10.000 Bits bringen, wenn nichts ausläuft. Wir wissen, dass die Bitrate des Datenstroms 6.000 Bits pro Sekunde beträgt. Nach der ersten Sekunde des codierten Inhalts in den Encoderpuffer sinkt die Fülle auf 4.000 Bits. In der Decodierungsanwendung wird dieser Stream mit 6.000 Bit pro Sekunde an den Decoderpuffer übermittelt. Nach einer Sekunde enthält der Puffer 6.000 Bits. Das erste Beispiel enthält 7.000 Bits, sodass der Decoderpuffer mehr gefüllt werden muss, bevor der Decoder mit dem Entfernen von Beispielen beginnt.
Festlegen von undichten Bucketwerten für ASF-Streams
In einem Dateicodierungsszenario kann eine Anwendung die Werte für undichte Buckets festlegen, während die Streams im ASF-Profil konfiguriert werden.
Nachdem Sie den Stream erstellt und einen Verweis auf die IMFASFStreamConfig-Schnittstelle des Streams erhalten haben, können Sie die Werte mithilfe der folgenden Attribute festlegen:
- MF_ASFSTREAMCONFIG_LEAKYBUCKET1 (durchschnittliche Werte für undichte Buckets)
- MF_ASFSTREAMCONFIG_LEAKYBUCKET2 (maximale Werte für undichte Buckets)
Informationen zum Hinzufügen von Streams und zum Abrufen des IMFASFStreamConfig-Zeigers finden Sie unter Hinzufügen von Streaminformationen zur ASF-Dateisenke.
Diese Werte enthalten den folgenden Satz von Informationen:
- Durchschnittliche Bitrate: Ruft die durchschnittliche Bitrate aus dem Ausgabemedientyp ab, der während der Medientypaushandlung ausgewählt wird. Verwenden Sie das Attribut MF_MT_AUDIO_AVG_BYTES_PER_SECOND (für Audiostreams) oder das attribut MF_MT_AVG_BITRATE (für Videostreams).
- Pufferfenster: Wenn Sie über eine instance des Encoders verfügen und Ausgabemedientypen ausgehandelt haben, können Sie diesen Wert später aktualisieren, indem Sie den Encoder für die IWMCodecLeakyBucket-Schnittstelle abfragen und dann IWMCodecLeakyBucket::GetBufferSizeBits (wmcodecifaces.h, wmcodecdspuuid.lib) aufrufen. Andernfalls verwenden Sie den Standardwert 3000 Millisekunden.
- Anfängliche Puffergröße: Auf 0 festgelegt.
Die von der Anwendung bereitgestellten Werte hängen vom Typ der Codierung und vom Medientyp des Datenstroms ab. Beispielsweise erfordert die Codierung mit konstanter Bitrate eine vordefinierte feste Bitrate und ein Pufferfenster. Die Anwendung kann diese undichten Bucketwerte angeben, indem sie die MFPKEY_VIDEOWINDOW-Codierungseigenschaft und das MF_ASFSTREAMCONFIG_LEAKYBUCKET1-Attribut für den Stream festlegt. Die angegebenen Pufferfensterwerte werden verwendet, um sicherzustellen, dass die codierte Datei die richtigen Sendezeiten aufweist, die auf den Datenpaketen markiert sind und der Prerollwert im ASF-Headerobjekt angezeigt wird. Es reicht aus, MF_ASFSTREAMCONFIG_LEAKYBUCKET1 festzulegen, da diese angegebenen Werte in das attribut MF_ASFSTREAMCONFIG_LEAKYBUCKET2 kopiert werden.
Für Codierungsmodi mit 2 Durchlauf müssen Sie beide Attribute festlegen, um den Mittel- und Höchstwert anzugeben.
Bei der VBR-Codierung kann die Anwendung erst nach Abschluss des Codierungsdurchlaufs die vom Encoder verwendeten leaky bucket-Werte abfragen. Daher kann die Anwendung beim Konfigurieren der Mediensenke die Attribute oder Eigenschaften im Zusammenhang mit undichten Buckets nicht festlegen. Nach der Codierung muss die Anwendung den Encoder für die Eigenschaften MFPKEY_RAVG, MFPKEY_BAVG, MFPKEY_RMAX und MFPKEY_BMAX abfragen und in der Mediensenke festlegen, sodass die genauen Werte im Headerobjekt widergespiegelt werden. Codebeispiele zum Aktualisieren der Werte für die VBR-Codierung finden Sie unter "Aktualisieren von Codierungseigenschaften in der Dateisenke" in Tutorial: 1-Pass Windows Media Encoding.
Wenn Sie Windows Media-Inhalte ohne Codierung aus der Quelle in die Mediensenke kopieren, müssen die Werte für undichte Buckets in der Mediensenke festgelegt werden.
Undichte Bucketwerte im ASF-Multiplexer
In Media Foundation werden die undichten Bucketwerte vom ASF-Multiplexer verwendet, um die internen Leaky-Bucketwerte einzurichten, die zum Generieren von Datenpaketen verwendet werden. Die Nutzlast ist in einem Medienbeispiel enthalten, und eine Reihe von Medienbeispielen stellt ein ASF-Datenpaket dar. Basierend auf den Leaky Bucket-Werten und der Präsentationszeit weist der Multiplexer für jedes Medienbeispiel eine Sendezeit zu, sodass die Bitraten der pakete, die über das Netzwerk gesendet werden, eine konstante Bitrate (R) aufweisen.
Eine Anwendung kann undichte Bucketwerte nicht direkt im Multiplexer festlegen. Die Werte müssen in der ASF-Mediensenke angegeben werden, die die entsprechenden Werte für den Multiplexer festlegt. Die in MF_ASFSTREAMCONFIG_LEAKYBUCKET1 und MF_ASFSTREAMCONFIG_LEAKYBUCKET2 festgelegten Werte werden vom Multiplexer verwendet, um zu überprüfen, ob die an die ASF-Mediensenke gesendeten Stichproben mit den angegebenen Werten generiert werden.
Aktualisieren von Leaky Bucket-Werten in der ASF-Mediensenke
Eine Anwendung kann die Werte für undichte Bucketwerte auf Streamebene (festgelegt im ASF-Profil während der Streamerstellung) überschreiben, indem die eigenschaft MFPKEY_ASFSTREAMSINK_CORRECTED_LEAKYBUCKET im Eigenschaftenspeicher der Mediensenke festgelegt wird. Verwenden Sie zum Abrufen eines Verweises auf den Eigenschaftenspeicher das von der Mediensenke implementierte ContentInfo-Objekt. Weitere Informationen finden Sie unter Festlegen von Eigenschaften in der Dateisenke.
Hinweis Dieser Vorgang ist nur für Audiostreams zulässig.
Diese Eigenschaft muss festgelegt werden, nachdem Sie den Ausgabetyp für den Encoder festgelegt haben. Basierend auf der im Medientyp festgelegten Bitrate berechnet der Encoder die Puffergröße, um sicherzustellen, dass die generierten Medienbeispiele den Puffer niemals überlaufen. Der Encoder nimmt während der Komprimierung erforderliche Anpassungen vor, um die Bitrate der komprimierten Stichproben innerhalb der durch das Bitraten- und Pufferfenster beschriebenen Grenzen zu halten.
Legen Sie ähnlich wie bei den Streamkonfigurationsattributen für undichte Buckets die durchschnittliche Bitrate und die Puffergröße sowie die anfängliche Pufferfülle in einem Array von DWORDs fest. Weitere Informationen finden Sie im Abschnitt "Festlegen von Leaky Bucket-Werten für ASF-Streams" in diesem Thema.
Zugehörige Themen