Implementieren der Ratensteuerung

In diesem Thema wird beschrieben, wie benutzerdefinierte Pipelineobjekte variable Wiedergaberaten unterstützen können, einschließlich umgekehrter Wiedergabe. Informationen zur Verwendung der Ratensteuerung aus einer Anwendung finden Sie unter Ratensteuerung.

Dieses Thema enthält folgende Abschnitte:

Wenn Sie ein Microsoft Media Foundation-Pipelineobjekt (Medienquelle, Transformation oder Mediensenke) schreiben, müssen Sie möglicherweise variable Wiedergaberaten unterstützen. Implementieren Sie hierzu die folgenden Schnittstellen:

  1. Implementieren Sie die IMFGetService-Schnittstelle .
  2. Unterstützen Sie den MF_RATE_CONTROL_SERVICE-Dienst . (Siehe Dienstschnittstellen.)
  3. Implementieren Sie die IMFRateSupport-Schnittstelle , die die vom Objekt unterstützten Wiedergaberaten abruft.
  4. Implementieren Sie die IMFRateControl-Schnittstelle , die die Wiedergaberate abruft oder festlegt.

Medienquellen

Wenn eine Medienquelle die Ratensteuerung unterstützt, sollte sie sowohl IMFRateSupport als auch IMFRateControl implementieren. Andernfalls meldet die Mediensitzung, dass die minimale und maximale Wiedergaberate 1,0 beträgt, unabhängig davon, welche anderen Komponenten sich in der Pipeline befinden.

Die Wiedergaberate wirkt sich nicht auf die Präsentationszeiten der Beispiele aus, sodass die Medienquelle ihre Zeitstempel nicht anpassen sollte. Stattdessen wird die Präsentationsuhr mit einer schnelleren oder langsameren Geschwindigkeit ausgeführt. Für die umgekehrte Wiedergabe liefert die Quelle Beispiele in umgekehrter Reihenfolge mit abnehmenden Zeitstempeln.

Der fThin-Parameter der IMFRateControl::SetRate-Methode gibt an, ob die Medienquelle den Inhalt verdünnen soll. Die Ausdünnung gilt in erster Linie für Videostreams. Im Dünnermodus löscht die Quelle Deltaframes und liefert nur Keyframes. Bei sehr hohen Wiedergaberaten überspringt die Quelle möglicherweise einige Keyframes (z. B. liefert alle anderen Keyframes).

Die Quelle muss keine Audiobeispiele im verdünnten Modus ablegen. Bei sehr hohen Wiedergaberaten ist die Quelle jedoch möglicherweise nicht in der Lage, Daten schnell zu lesen und die Beispielanforderungen der Pipeline zu erfüllen. In diesem Fall muss die Quelle möglicherweise einige Audiodaten löschen. Wenn dies der Fall ist, sollte versucht werden, Audiobeispiele bereitzustellen, die den Videobeispielen nahe kommen (vorausgesetzt, die Quelle verfügt über beide Arten von Datenstrom).

Wenn ein Stream zwischen dem Durchdünnungsmodus und dem nicht verdünnten Modus wechselt, sendet er ein MEStreamThinMode-Ereignis .

Wenn die Medienquelle einen Aufruf von SetRate abschließt, sendet sie das MESourceRateChanged-Ereignis .

Während der umgekehrten Wiedergabe:

  • Die Medienquelle liefert Beispiele in umgekehrter Reihenfolge, ohne die Zeitstempel anzupassen.
  • Zeitstempel innerhalb eines Datenstroms sollten monoton abnehmen.
  • Der Anfang des Inhalts wird als das Ende des Datenstroms betrachtet. Nachdem jeder Medienstream das erste Beispiel im Stream (d. h. Präsentationszeit = 0) übermittelt hat, sendet er das MEEndOfStream-Ereignis .

Media Foundation-Transformationen

Im Allgemeinen benötigt eine Media Foundation-Transformation (MFT) keine explizite Unterstützung für die Ratensteuerung, es sei denn, der MFT implementiert eine nicht verdünnte umgekehrte Wiedergabe.

Wenn ein MFT die IMFRateSupport-Schnittstelle nicht implementiert, wird für die Mediensitzung Folgendes vorausgesetzt:

  • Der MFT unterstützt arbitäre Wiedergaberaten für die Vorwärtswiedergabe, sowohl verdünnt als auch nicht verdünnt.
  • Der MFT unterstützt eine verdünnte umgekehrte Wiedergabe, aber keine nicht verdünnte umgekehrte Wiedergabe.

Wenn eine dieser Bedingungen nicht zutrifft, sollte der MFT IMFRateSupport und IMFRateControl implementieren.

Umgekehrte Wiedergabe

Die Mediensitzung kann umgekehrt wiedergegeben werden, auch wenn eine oder mehrere Transformationen in der Pipeline die umgekehrte Wiedergabe nicht explizit unterstützen.

Wenn ein MFT die IMFRateSupport-Schnittstelle nicht verfügbar macht, verwendet die Mediensitzung die Verdünnung für die umgekehrte Wiedergabe wie folgt:

  • Die Mediensitzung sendet Keyframes auf die übliche Weise an den MFT, indem IMFTransform::P rocessInput aufgerufen wird.

  • Die Mediensitzung löscht Deltaframes und ersetzt sie durch MEStreamTick-Ereignisse .

  • Zwischen jedem Beispiel löscht die Mediensitzung den MFT, um Fehler zu vermeiden, die durch die Tatsache verursacht werden, dass die Zeitstempel abnehmen.

Ein Beispiel gilt als Keyframe, wenn das Attribut MFSampleExtension_CleanPoint auf TRUE festgelegt ist, und als Deltaframe betrachtet wird, wenn dieses Attribut FALSE ist oder nicht festgelegt ist.

Wenn der MFT IMFRateSupport implementiert, verwendet die Mediensitzung diese Schnittstelle, um zu ermitteln, ob der MFT eine nicht verdünnte umgekehrte Wiedergabe unterstützt. Wenn der MFT eine nicht verdünnte Umgekehrte Wiedergabe unterstützt, werden von der Mediensitzung alle Beispiele in umgekehrter Reihenfolge übermittelt, ohne die Beispiele zu löschen oder die MFT zu leeren.

Wenn ein MFT eine nicht verdünnte Reversewiedergabe unterstützt, sollte die IMFRateControl-Schnittstelle implementiert werden. Die Mediensitzung verwendet diese Schnittstelle, um den MFT zu benachrichtigen, wenn die umgekehrte Wiedergabe erfolgt. Zu diesem Zeitpunkt muss der MFT darauf vorbereitet sein, dass die Zeitstempel verringert werden und deltaframes in umgekehrter Reihenfolge eintreffen. Ein Decoder muss in der Regel Beispiele puffern, bis er eine gesamte Gruppe von Bildern (GOP) erhalten hat, dann den gesamten GOP decodieren und die decodierten Frames in der richtigen (umgekehrten) Reihenfolge ausgeben.

Mediensenken

Wenn eine Mediensenke ratenlos ist, geht die Mediensitzung davon aus, dass die Mediensenke jede Wiedergaberate verarbeiten kann. Die Mediensenke muss nicht IMFRateSupport implementieren. (Eine Rateless-Mediensenke gibt das MEDIASINK_RATELESS-Flag der IMFMediaSink::GetCharacteristics-Methode zurück.)

Andernfalls sollte eine Mediensenke IMFRateSupport implementieren, wenn sie andere Wiedergaberaten als 1.0 verarbeiten kann.

Mediensenken sollten IMFRateControl nicht implementieren. Wenn sich die Wiedergaberate ändert, ruft die Präsentationsuhr die IMFClockStateSink::OnClockSetRate-Methode der Mediensenke auf.

Ratensteuerung

Suchen, Fast Forward und Reverse Play