Implementieren der Ratensteuerung
In diesem Thema wird beschrieben, wie benutzerdefinierte Pipelineobjekte variable Wiedergaberaten unterstützen können, einschließlich umgekehrter Wiedergabe. Informationen zum Verwenden des Zinssteuerelements aus einer Anwendung finden Sie unter Rate Control.
Dieses Thema enthält folgende Abschnitte:
Wenn Sie ein Microsoft Media Foundation-Pipelineobjekt (eine Medienquelle, Transformation oder Mediensenke) schreiben, müssen Sie möglicherweise variable Wiedergaberaten unterstützen. Implementieren Sie dazu die folgenden Schnittstellen:
- Implementieren Sie die IMFGetService-Schnittstelle.
- Unterstützen Sie den MF_RATE_CONTROL_SERVICE-Dienst . (Siehe Dienstschnittstellen.)
- Implementieren Sie die IMFRateSupport-Schnittstelle , die die vom Objekt unterstützten Wiedergaberaten abruft.
- Implementieren Sie die IMFRateControl-Schnittstelle , die die Wiedergaberate abruft oder festlegt.
Medienquellen
Wenn eine Medienquelle die Steuerung der Rate 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 in der Pipeline enthalten sind.
Die Wiedergaberate wirkt sich nicht auf die Darstellungszeiten der Beispiele aus, sodass die Medienquelle ihre Zeitstempel nicht anpassen sollte. Stattdessen wird die Präsentationsuhr mit einer schnelleren oder langsameren Geschwindigkeit ausgeführt. Bei umgekehrter 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 dünnen soll. Die Verdünnung gilt in erster Linie für Videostreams. Im dünnen Modus legt die Quelle Deltaframes ab und liefert nur Keyframes. Bei sehr hohen Wiedergaberaten kann die Quelle einige Keyframes überspringen (z. B. alle anderen Keyframes bereitstellen).
Die Quelle muss keine Audiobeispiele im dünnen Modus ablegen. Bei sehr hohen Wiedergaberaten ist die Quelle jedoch möglicherweise nicht in der Lage, Daten schnell genug zu lesen, um die Beispielanforderungen der Pipeline auszufüllen. In diesem Fall muss die Quelle möglicherweise einige Audiodaten ablegen. Wenn dies der Fall ist, sollte versucht werden, Audiobeispiele bereitzustellen, die sich rechtzeitig an die Videobeispiele befinden (vorausgesetzt, die Quelle verfügt über beide Arten von Datenstrom).
Wenn ein Datenstrom zwischen dem dünnen und nicht dünnen Modus wechselt, sendet er ein MEStreamThinMode-Ereignis .
Wenn die Medienquelle einen Aufruf von SetRate abgeschlossen hat, 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 Ende des Datenstroms betrachtet. Nachdem jeder Mediendatenstrom das erste Beispiel im Datenstrom übermittelt hat (d. h. präsentationszeit = 0), sendet er das MEEndOfStream-Ereignis .
Media Foundation-Transformationen
Im Allgemeinen benötigt eine Media Foundation-Transformation (MFT) keine explizite Unterstützung für die Steuerung der Rate, es sei denn, die MFT implementiert nicht verdünnte Reversewiedergabe.
Wenn eine MFT die IMFRateSupport-Schnittstelle nicht implementiert, wird von der Mediensitzung folgendes vorausgesetzt:
- MFT unterstützt arbitäre Wiedergaberaten für die Vorwärtswiedergabe, sowohl dünn als auch nicht dünn.
- MFT unterstützt die verdünnte Umgekehrte Wiedergabe, unterstützt jedoch keine nicht dünne Umgekehrte Wiedergabe.
Wenn eine dieser Bedingungen nicht zutrifft, sollte MFT IMFRateSupport und IMFRateControl implementieren.
Wiedergabe umkehren
Die Mediensitzung kann umgekehrt wiedergegeben werden, auch wenn eine oder mehrere Transformationen in der Pipeline die Reversewiedergabe nicht explizit unterstützen.
Wenn eine 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 legt Deltaframes ab und ersetzt sie durch MEStreamTick-Ereignisse .
Zwischen jedem Beispiel löscht die Mediensitzung die MFT, um Fehler zu vermeiden, die durch die Tatsache verursacht werden, dass die Zeitstempel abnehmen.
Ein Beispiel wird als Keyframe betrachtet, wenn es das MFSampleExtension_CleanPoint Attribut auf TRUE festgelegt hat und als Deltaframe betrachtet wird, wenn dieses Attribut FALSCH ist oder nicht festgelegt ist.
Wenn der MFT IMFRateSupport implementiert, verwendet die Mediensitzung diese Schnittstelle, um zu ermitteln, ob die MFT die nicht dünne Reversewiedergabe unterstützt. Wenn die MFT die nicht dünne Umgekehrte Wiedergabe unterstützt, liefert die Mediensitzung alle Beispiele in umgekehrter Reihenfolge, ohne Proben abzugeben oder die MFT zu leeren.
Wenn ein MFT die nicht verdünnte Reversewiedergabe unterstützt, sollte die IMFRateControl-Schnittstelle implementiert werden. Die Mediensitzung verwendet diese Schnittstelle, um die MFT zu benachrichtigen, wenn die Rückwärtswiedergabe auftritt. Zu diesem Zeitpunkt muss der MFT für die Zeitstempel vorbereitet sein, um die Delta-Frames in umgekehrter Reihenfolge einzutreffen. Ein Decoder muss in der Regel Beispiele puffern, bis er eine ganze 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 ohne Sätze ist , geht die Mediensitzung davon aus, dass die Mediensenke jede Wiedergaberate verarbeiten kann. Die Mediensenke muss nicht IMFRateSupport implementieren. (Eine Spüle ohne Geschwindigkeit gibt die MEDIASINK_RATELESS Kennzeichnung aus dem IMFMediaSink::GetCharacteristics-Methode .)
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.
Zugehörige Themen