Mediensenken
Mediensenken sind die Pipelineobjekte, die Mediendaten empfangen. Eine Mediensenke ist das Ziel für einen oder mehrere Medienströme. Mediensenken sind in zwei allgemeine Kategorien unterteilt:
Ein Renderer ist eine Mediensenke, die Daten für die Wiedergabe darstellt. Der erweiterte Videorenderer (EVR) zeigt Videoframes an, und der Audiorenderer gibt Audiostreams über die Soundkarte oder ein anderes Audiogerät wieder.
Eine Archivsenke ist eine Mediensenke, die Daten in eine Datei oder einen anderen Speicher schreibt.
Der Hauptunterschied zwischen ihnen besteht darin, dass eine Archivsenke die Daten nicht mit einer festen Wiedergaberate verbraucht. Stattdessen werden die Daten geschrieben, die sie so schnell wie möglich empfängt.
Mediensenken machen die IMFMediaSink Schnittstelle verfügbar. Jede Medienspüle enthält eine oder mehrere Datenstromsenken. Jede Datensenke empfängt die Daten aus einem Datenstrom. Stream-Senken machen die IMFStreamSink Schnittstelle verfügbar. In der Regel erstellt eine Anwendung keine Mediensenken direkt. Stattdessen erstellt die Anwendung mindestens ein Aktivierungsobjekt, das von der Mediensitzung zum Erstellen der Spüle verwendet wird. Alle anderen Vorgänge auf der Spüle werden von der Mediensitzung behandelt, und die Anwendung ruft keine Methoden für die Mediensenke oder einen der Stream-Senken auf. Weitere Informationen zu Aktivierungsobjekten finden Sie unter Activation Objects.
Wenn Sie eine benutzerdefinierte Mediensenke schreiben oder eine Mediensenke direkt ohne die Mediensitzung verwenden möchten, sollten Sie den Rest dieses Themas lesen.
- Stream Sinks
- Präsentationsuhr
- Streamformate
- Datenfluss-
- Markierungen
- Statusänderungen
- abschließen
- Herunterfahren
- Mediensenkenschnittstellen
- Stream Sink Interfaces
- Stream Sink-Ereignisse
- Verwandte Themen
Stream-Senken
Eine Mediensenke kann eine feste Anzahl von Datenstromsenken aufweisen, oder sie kann das Hinzufügen und Entfernen von Stream-Senken unterstützen. Wenn eine feste Anzahl von Datenstromsenken vorhanden ist, gibt die IMFMediaSink::GetCharacteristics Methode das MEDIASINK_FIXED_STREAMS Flag zurück. Andernfalls können Sie Stream-Senken hinzufügen und entfernen. Rufen Sie IMFMediaSink::AddStreamSinkauf, um eine neue Stream-Spüle hinzuzufügen. Rufen Sie zum Entfernen einer Datenstromsenke IMFMediaSink::RemoveStreamSinkauf. Das flag MEDIASINK_FIXED_STREAMS gibt an, dass die Mediensenke diese beiden Methoden nicht unterstützt. (Es kann eine andere Möglichkeit zum Konfigurieren der Anzahl von Datenströmen unterstützen, z. B. durch Festlegen von Initialisierungsparametern, wenn die Spüle erstellt wird.) Die Liste der Datenstromsenken wird sortiert. Rufen Sie zum Aufzählen nach Indexwert die IMFMediaSink::GetStreamSinkByIndex--Methode auf.
Stream-Senken weisen auch Bezeichner auf. Stream-IDs sind innerhalb der Mediensenke eindeutig, müssen jedoch nicht aufeinander folgen. Je nach Mediensenke haben die Datenstrombezeichner möglicherweise eine Bedeutung, die sich auf den Inhalt bezieht. Beispielsweise kann eine Archivsenke die Datenstrom-IDs in den Dateiheader schreiben. Andernfalls sind sie willkürlich. Rufen Sie IMFMediaSink::GetStreamSinkByIdauf, um eine Datenstromsenke anhand des Bezeichners abzurufen.
Präsentationsuhr
Die Häufigkeit, mit der eine Medienspüle Proben verbraucht, wird durch die Presentation Clockgesteuert. Die Mediensitzung wählt die Präsentationsuhr aus und legt sie auf der Medienspüle fest, indem sie die IMFMediaSink::SetPresentationClock-Methode aufruft. Die Präsentationsuhr muss auf der Mediensenke festgelegt werden, bevor das Streaming beginnen kann. Für jede Mediensenke ist eine Präsentationsuhr erforderlich. Die Medienspüle verwendet die Präsentationsuhr für zwei Zwecke:
So empfangen Sie Benachrichtigungen beim Starten oder Beenden des Streamings. Die Mediensenke empfängt diese Benachrichtigungen über die IMFClockStateSink Schnittstelle, die alle Mediensenken implementieren müssen.
Um zu bestimmen, wann Beispiele gerendert werden sollen. Wenn die Mediensenke ein neues Beispiel empfängt, erhält sie den Zeitstempel aus dem Beispiel und versucht, das Beispiel zu dieser Präsentationszeit zu rendern.
Die Präsentationsuhr leitet ihre Uhrzeiten von einem anderen Objekt ab, das als Präsentationszeitquellebezeichnet wird. Präsentationszeitquellen machen die IMFPresentationTimeSource Schnittstelle verfügbar. Einige Mediensenken haben Zugriff auf eine genaue Uhr, sodass sie diese Schnittstelle verfügbar machen. Dies bedeutet, dass eine Medienspüle Beispiele für eine Zeit planen kann, die von einer eigenen Uhr bereitgestellt wird. Die Medienspüle kann jedoch nicht davon ausgehen, dass dies der Fall ist. Es muss immer die Zeit aus der Präsentationsuhr verwenden, unabhängig davon, ob die Präsentationsuhr von der Mediensenke selbst oder von einer anderen Uhr gesteuert wird.
Wenn eine Mediensenke nicht mit einer anderen Als einer uhr übereinstimmen kann, gibt die GetCharacteristics--Methode das MEDIASINK_CANNOT_MATCH_CLOCK Flag zurück. Wenn diese Kennzeichnung vorhanden ist und die Präsentationsuhr eine andere Präsentationszeitquelle verwendet, ist die Mediensenke wahrscheinlich schlecht ausgeführt. Beispielsweise kann es während der Wiedergabe glitchen.
Eine rateless Spüle ist eine Medienspüle, die die Zeitstempel für Proben ignoriert und Daten verbraucht, sobald jede Probe eintrifft. Eine Spüle ohne Geschwindigkeit gibt das MEDIASINK_RATELESS Flag aus der GetCharacteristics--Methode zurück. Diese Kennzeichnung gilt in der Regel für Archivsenken. Wenn jede Mediensenke in der Pipeline rateless ist, verwendet die Mediensitzung eine spezielle, ratelose Präsentationsuhr. Diese Uhr läuft so schnell, wie die Senken Proben verbrauchen.
Streamformate
Bevor die Mediensenke Proben empfangen kann, muss der Client den Medientyp auf den Stream-Senken festlegen. Rufen Sie zum Festlegen des Medientyps die IMFStreamSink::GetMediaTypeHandler-Methode auf. Diese Methode gibt einen Zeiger auf die IMFMediaTypeHandler Schnittstelle zurück. Verwenden Sie diese Schnittstelle, um die Liste der bevorzugten Medientypen abzurufen, den aktuellen Medientyp abzurufen und den Medientyp festzulegen.
Rufen Sie IMFMediaTypeHandler::GetMediaTypeByIndexauf, um die Liste der bevorzugten Medientypen abzurufen. Die bevorzugten Typen sollten als Hinweis für den Client verwendet werden. Die Liste kann unvollständig sein oder teilweise Medientypen enthalten. Ein partieller Medientyp ist ein Typ, der nicht über alle Attribute verfügt, die zum Beschreiben eines gültigen Formats erforderlich sind. Beispielsweise kann ein partieller Videotyp den Farbraum und die Bittiefe angeben, aber nicht die Bildbreite oder -höhe. Ein partieller Audiotyp kann das Komprimierungsformat und die Samplingrate angeben, aber nicht die Anzahl der Audiokanäle.
Rufen Sie zum Abrufen des aktuellen Medientyps des Datenstroms IMFMediaTypeHandler::GetCurrentMediaTypeauf. Wenn eine Datenstromsenke zum ersten Mal erstellt wird, ist möglicherweise bereits ein Standardmedientyp festgelegt, oder es hat keinen Medientyp, bis der Client einen festgelegt hat.
Rufen Sie zum Festlegen des Medientyps IMFMediaTypeHandler::SetCurrentMediaTypeauf. Einige Stream-Senken unterstützen möglicherweise keine Änderung des Typs, nachdem festgelegt wurde. Daher ist es hilfreich, Medientypen zu testen, bevor Sie sie festlegen. Rufen Sie IMFMediaTypeHandler::IsMediaTypeSupportedauf, um zu testen, ob die Mediensenke einen Medientyp akzeptiert (ohne Einstellung des Typs).
Datenfluss
Mediensenken verwenden ein Pullmodell, was bedeutet, dass der Datenstrom daten nach Bedarf anfordert. Der Client sollte zeitnah reagieren, um störungen zu vermeiden.
Einige Mediensenken unterstützen Vorabrolling. Das Vorabrolling ist der Prozess, mit dem Daten an die Medienspüle vor dem Start der Präsentationsuhr zurückgegeben werden. Wenn eine Mediensenke die Vorabrolling unterstützt, macht die Mediensenke die IMFMediaSinkPreroll- Schnittstelle verfügbar, und die GetCharacteristics--Methode gibt das MEDIASINK_CAN_PREROLL Flag zurück. Beim Vorabrolling wird sichergestellt, dass die Mediensenke bereit ist, das erste Beispiel vorzustellen, wenn die Präsentationsuhr beginnt. Es wird empfohlen, dass der Client immer vorabrollt, wenn die Mediensenke dies unterstützt, da dadurch Störungen oder Lücken während der Wiedergabe verhindert werden können.
Der Datenfluss zu einer Mediensenke funktioniert wie folgt:
- Der Client legt die Medientypen und die Präsentationsuhr fest. Die Mediensenke registriert sich mit der Präsentationsuhr, um Benachrichtigungen über Änderungen des Uhrzustands zu erhalten.
- Optional fragt der Client IMFMediaSinkPrerollab. Wenn die Mediensenke diese Schnittstelle verfügbar macht, ruft der Client IMFMediaSinkPreroll::NotifyPrerollauf. Andernfalls springt der Client zu Schritt 5.
- Jede Datenstromsenke sendet ein oder mehrere MEStreamSinkRequestSample--Ereignisse. Als Reaktion auf jedes dieser Ereignisse ruft der Client das nächste Datenbeispiel für diesen Datenstrom ab und ruft IMFStreamSink::P rocessSampleauf.
- Wenn jede Datenstromsenke genügend Vorabdaten empfängt, sendet sie ein MEStreamSinkPrerolled-Ereignis.
- Der Client ruft IMFPresentationClock::Start auf, um die Präsentationsuhr zu starten.
- Die Präsentationsuhr benachrichtigt die Mediensenke, dass die Uhr gestartet wird, indem IMFClockStateSink::OnClockStartaufgerufen wird.
- Um weitere Daten abzurufen, sendet jede Datensenke MEStreamSinkRequestSample--Ereignisse. Als Reaktion auf jedes dieser Ereignisse ruft der Client das nächste Beispiel ab und ruft ProcessSampleauf. Dieser Schritt wird bis zum Ende der Präsentation wiederholt.
Die meisten Mediensenken verarbeiten Proben asynchron, sodass die Datenstromsenke mehrere Beispielanforderungen gleichzeitig senden können.
Während des Streamings kann der Client jederzeit IMFStreamSink::P laceMarker- und IMFStreamSink::Flush aufrufen. Marker werden im nächsten Abschnitt beschrieben. Durch das Leeren wird die Datenstromsenke alle Beispiele ablegen, die sie in die Warteschlange gestellt, aber noch nicht gerendert hat.
Markierungen
Markierungen bieten eine Möglichkeit für den Client, bestimmte Punkte im Datenstrom anzugeben. Eine Markierung besteht aus den folgenden Informationen:
- Der Markierungstyp, der als Element der MFSTREAMSINK_MARKER_TYPE-Aufzählung definiert ist.
- Daten, die der Markierung zugeordnet sind. Die Bedeutung der Daten hängt vom Markertyp ab. Einige Markierungstypen verfügen nicht über Daten.
- Optionale Daten für die eigene Verwendung des Clients.
Zum Platzieren einer Markierung ruft der Client IMFStreamSink::P laceMarkerauf. Die Datenstromsenke verarbeitet alle Beispiele, die sie vor dem PlaceMarker Aufruf empfangen haben, und sendet dann ein MEStreamSinkMarker--Ereignis.
Die meisten Mediensenken behalten eine Warteschlange mit ausstehenden Beispielen bei, die sie asynchron verarbeiten. Markerereignisse müssen mit der Beispielverarbeitung serialisiert werden, sodass die Mediensenke die Markierungen in derselben Warteschlange platzieren sollte. Angenommen, der Client führt die folgenden Methodenaufrufe aus:
- ProcessSample- (Beispiel Nr. 1)
- ProcessSample- (Beispiel Nr. 2)
- PlaceMarker- (Markierung Nr. 1)
- ProcessSample- (Beispiel Nr. 3)
- PlaceMarker- (Markierung Nr. 2)
In diesem Beispiel muss die Datenstromsenke das MEStreamSinkMarker Ereignis für markierung #1 nach dem Verarbeiten von Beispiel #2 und das Ereignis für markierung #2 nach dem Verarbeiten des Beispiels #3 senden.
Wenn der Client eine Datenstromsenke löscht, verarbeitet die Datenstromsenke sofort alle Markierungen, die sich in der Warteschlange befanden. Er legt den Statuscode auf E_ABORT für diese Ereignisse fest.
Einige Marker enthalten Informationen, die für die Mediensenke relevant sind:
- MFSTREAMSINK_MARKER_TICK: Gibt an, dass im Datenstrom eine Lücke besteht. Das nächste Beispiel ist eine Einstellung.
- MFSTREAMSINK_MARKER_ENDOFSEGMENT: Gibt das Ende eines Segments oder das Ende eines Datenstroms an. Das nächste Beispiel (falls vorhanden) kann eine Einstellung sein.
- MFSTREAMSINK_MARKER_EVENT: Enthält ein Ereignis. Abhängig vom Ereignistyp und der Implementierung der Mediensenke kann die Mediensenke das Ereignis behandeln oder ignorieren.
Statusänderungen
Eine Medienspüle wird über Zustandsänderungen in der Präsentationsuhr über die IMFClockStateSink Schnittstelle der Mediensenke benachrichtigt. Wenn der Client die Präsentationsuhr festlegt, ruft die Mediensenke IMFPresentationClock::AddClockStateSink, um sich für Benachrichtigungen von der Uhr zu registrieren. In der folgenden Tabelle wird zusammengefasst, wie sich eine Mediensenke als Reaktion auf Änderungen des Taktzustands verhält.
Änderung des Zeitzustands | Beispielverarbeitung | Markierungsverarbeitung |
---|---|---|
OnClockStart- | Prozessbeispiele, deren Zeitstempel gleich oder höher als die Startzeit der Uhr ist. | Senden Sie das MEStreamSinkMarker Ereignis, wenn alle Beispiele, die vor der Verarbeitung der Markierung empfangen wurden, empfangen wurden. |
OnClockPause | Die Mediensenke kann ProcessSample- während der Pause fehlschlagen. Wenn die Mediensenke Beispiele akzeptiert, während sie angehalten werden, muss sie in die Warteschlange gestellt werden, bis die Uhr neu gestartet wird. Verarbeiten Sie keine in die Warteschlange eingereihten Beispiele, während sie angehalten sind. |
Wenn in die Warteschlange eingereihte Beispiele vorhanden sind, platzieren Sie Markierungen in derselben Warteschlange. Senden Sie das Markerereignis, wenn die Uhr neu gestartet wird. Andernfalls senden Sie das Markierungsereignis sofort. |
OnClockRestart- | Verarbeiten Sie alle Beispiele, die während des Anhaltens in die Warteschlange eingereiht wurden, und behandeln Sie dann dasselbe wie OnClockStart-. | Senden Sie MEStreamSinkMarker Ereignisse für in die Warteschlange eingereihte Markierungen (serialisiert mit Beispielverarbeitung), und behandeln Sie dann dasselbe wie OnClockStart-. |
OnClockStop- | Legen Sie alle in die Warteschlange eingereihten Beispiele ab. Weitere Aufrufe von ProcessSample- können fehlschlagen. | Senden von Markerereignissen in der Warteschlange. Senden Sie bei nachfolgenden Aufrufen von PlaceMarker-das Markierungsereignis sofort. |
Darüber hinaus müssen Stream-Senken die folgenden Ereignisse senden, wenn sie die Zustandsübergänge abgeschlossen haben:
- OnClockStart, OnClockRestart: MEStreamSinkStarted-Ereignis
- OnClockPause: MEStreamSinkPaused-Ereignis
- OnClockStop-: MEStreamSinkStopped-Ereignis
Beendend
Einige Mediensenken erfordern einen zusätzlichen Verarbeitungsschritt, nachdem das letzte Beispiel geliefert wurde. In der Regel gilt diese Anforderung für Archivsenken, die Kopfzeilen oder Indizes in die Datei schreiben müssen. Wenn eine Mediensenke eine endgültige Verarbeitung erfordert, macht sie die IMFFinalizableMediaSink- Schnittstelle verfügbar.
Nachdem der Client das letzte Beispiel übermittelt hat, fragt der Client diese Schnittstelle ab. Wenn die Mediensenke die Schnittstelle unterstützt, ruft der Client IMFFinalizableMediaSink::BeginFinalize auf, um die endgültige Verarbeitung asynchron auszuführen. Diese Methode folgt dem standardmäßigen Media Foundation-asynchronen Modell, das in asynchronen Rückrufmethodenbeschrieben wird. Die Mediensenke kann davon ausgehen, dass der Client BeginFinalizeaufruft. Fehler beim Aufrufen BeginFinalize- kann zu einer falsch erstellten Datei führen.
Herunterfahren
Wenn der Client die Mediensenke verwendet, ruft der Client IMFMediaSink::Shutdownauf. Innerhalb dieser Methode sollte die Mediensenke alle Zirkelbezugsanzahlen unterbrechen. In der Regel gibt es Zirkelbezüge zwischen der Mediensenke und den Stromsinken.
Wenn Sie das Hilfsobjekt der Ereigniswarteschlange verwenden, um IMFMediaEventGeneratorzu implementieren, rufen Sie IMFMediaEventQueue::Shutdown in der Ereigniswarteschlange auf. Diese Methode beendet die Ereigniswarteschlange und signalisiert alle Aufrufer, die derzeit auf ein Ereignis warten.
Nach dem Herunterfahren geben alle Methoden für die Mediensenke MF_E_SHUTDOWN zurück, mit Ausnahme von IUnknown Methoden.
Mediensenkenschnittstellen
In der folgenden Tabelle sind die Standardschnittstellen aufgeführt, die Mediensenken über QueryInterface-verfügbar machen können. Mediensenken können auch benutzerdefinierte Schnittstellen verfügbar machen.
Schnittstelle | Beschreibung |
---|---|
IMFMediaSink- | Die primäre Schnittstelle für Mediensenken. (Erforderlich.) |
IMFClockStateSink- | Wird verwendet, um die Mediensenke zu benachrichtigen, wenn sich der Zustand der Präsentationsuhr ändert. (Erforderlich.) |
IMFFinalizableMediaSink | Implementieren Sie, ob die Mediensenke einen letzten Verarbeitungsschritt ausführen muss. (Optional.) |
IMFGetService- | Implementieren Sie, ob die Mediensenke Dienstschnittstellen verfügbar macht. (Optional.) |
IMFMediaEventGenerator | Implementieren Sie, ob die Mediensenke Ereignisse sendet. (Optional.) |
IMFMediaSinkPreroll- | Implementieren Sie, ob die Mediensenke preroll unterstützt. (Optional.) |
IMFPresentationTimeSource- | Implementieren Sie, ob die Mediensenke eine Zeitquelle für die Präsentationsuhr bereitstellen kann. (Optional.) |
IMFQualityAdvise | Implementieren Sie, ob die Mediensenke die Wiedergabequalität anpassen kann. (Optional.) |
Optional kann eine Mediensenke die folgende Schnittstelle als Dienst implementieren.
Dienstschnittstelle | Beschreibung |
---|---|
IMFRateSupport- | Meldet den Bereich der unterstützten Wiedergaberaten. |
Weitere Informationen zu Dienstschnittstellen und IMFGetService-finden Sie unter Service Interfaces.
Stream-Senkenschnittstellen
Stream-Senken müssen die folgenden Schnittstellen über QueryInterface-verfügbar machen.
Schnittstelle | Beschreibung |
---|---|
IMFStreamSink- | Die primäre Schnittstelle für Datenstromsenken. (Erforderlich.) |
IMFMediaEventGenerator | Warteschlangenereignisse. Die IMFStreamSink Schnittstelle erbt diese Schnittstelle. (Erforderlich.) |
Derzeit sind keine Dienstschnittstellen für Datenstromsenken definiert.
Stream Sink-Ereignisse
In der folgenden Tabelle sind die Ereignisse aufgeführt, die für generische Datenstromsenken definiert sind. Stream-Senken können auch benutzerdefinierte Ereignisse senden, die hier nicht aufgeführt sind.
Ereignis | Beschreibung |
---|---|
MEStreamSinkFormatChanged | Der Medientyp der Datensenke ist nicht mehr gültig. (Optional.) |
MEStreamSinkMarker- | Eine Markierung wurde verarbeitet. (Erforderlich.) |
MEStreamSinkPaused | Die Streamspüle wurde angehalten. (Erforderlich.) |
MEStreamSinkPrerolled | Die Vorabregistrierung ist abgeschlossen. (Optional.) |
MEStreamSinkRateChanged | Die Stream-Spüle hat die Wiedergaberate geändert. (Optional.) |
MEStreamSinkRequestSample- | Es wird ein neues Beispiel angefordert. (Erforderlich.) |
MEStreamSinkScrubSampleComplete | Eine Scrub-Anforderung wurde abgeschlossen. (Optional.) |
MEStreamSinkStarted | Die Stream-Spüle wurde gestartet. (Erforderlich.) |
MEStreamSinkStopped- | Die Stromsenke wurde angehalten. (Erforderlich.) |
Derzeit werden keine allgemeinen Ereignisse für Mediensenken definiert. Einige Mediensenken senden möglicherweise benutzerdefinierte Ereignisse.
Verwandte Themen