Freigeben über


Präsentationsuhr

Die Präsentationsuhr ist ein Objekt, das die Uhrzeit für eine Präsentation generiert. Die von der Präsentationsuhr gemeldete Uhrzeit wird als Präsentationszeitbezeichnet. Alle Datenströme in einer Präsentation werden mit der Präsentationszeit synchronisiert. Die Präsentationsuhr macht die folgenden Schnittstellen verfügbar.

Schnittstelle Beschreibung
IMFPresentationClock- Primäre Schnittstelle für die Verwendung der Präsentationsuhr.
IMFRateControl- Steuert die Taktrate.
IMFTimer- Stellt einen Timerrückruf bereit.
IMFShutdown- Beendet die Präsentationsuhr.

 

Mediensenken verwenden die Präsentationszeit, um zu planen, wann Beispiele gerendert werden sollen. Wenn eine Mediensenke ein neues Beispiel empfängt, erhält sie den Zeitstempel aus dem Beispiel und rendert das Beispiel zur angegebenen Zeit oder so nah wie möglich. Da alle Mediensenken in einer Topologie dieselbe Präsentationsuhr verwenden, werden mehrere Streams (z. B. Audio und Video) synchronisiert. Medienquellen und Transformationen verwenden die Präsentationsuhr nicht, da sie nicht planen, wann Beispiele geliefert werden sollen. Stattdessen erzeugen sie Stichproben, wenn die Pipeline ein neues Beispiel anfordert.

Wenn Sie die Mediensitzung für die Wiedergabe verwenden, behandelt die Mediensitzung alle Details zum Erstellen der Präsentationsuhr, auswählen einer Zeitquelle und Benachrichtigen der Mediensenken. Ihre Anwendung verwendet möglicherweise die Präsentationsuhr, um die aktuelle Präsentationszeit während der Wiedergabe abzurufen, andernfalls werden keine Methoden für die Präsentationsuhr aufgerufen.

Zeit- und Uhrzeitzustände

Rufen Sie IMFPresentationClock::GetTimeauf, um die aktuelle Uhrzeit von der Präsentationsuhr zu erhalten. Taktzeiten sind immer in 100-Nanosekundeneinheiten enthalten, sodass eine Sekunde 10.000.000 (10^7) Teilstriche ist. Dies entspricht einer Frequenz von 10 MHz.

Die Präsentationsuhr weist drei Zustände auf: Wird ausgeführt, angehalten und beendet.

  • Rufen Sie zum Ausführen der Uhr IMFPresentationClock::Startauf. Die Start--Methode gibt die Startzeit der Uhr an. Während die Uhr läuft, erhöht sich die Zeit von der Startzeit bis zur aktuellen Taktrate.
  • Um die Uhr anzuhalten, rufen Sie IMFPresentationClock::P auseauf. Während die Uhr angehalten wird, wird die Uhr nicht vorankommen, und GetTime- gibt die Zeit zurück, zu der die Uhr angehalten wurde.
  • Rufen Sie zum Beenden der Uhr IMFPresentationClock::Stopauf. Wenn die Uhr angehalten wird, wird die Uhrzeit nicht voraus, und GetTime- gibt Null zurück.

Standardmäßig wechselt die Uhr mit einer Rate von 1,0, was bedeutet, dass 1 Tick pro 100 Nanosekunden. Um die Häufigkeit zu ändern, mit der die Uhr voranschreitet, fragen Sie die Präsentationsuhr für die IMFRateControl Schnittstelle ab, und rufen Sie IMFRateControl::SetRateauf.

Objekte können Benachrichtigungen über Zustandsänderungen (einschließlich Rateänderungen) von der Präsentationsuhr empfangen. Implementieren Sie zum Empfangen von Benachrichtigungen die IMFClockStateSink Schnittstelle, und rufen Sie IMFPresentationClock::AddClockStateSink auf der Präsentationsuhr auf. Rufen Sie vor dem Herunterfahren IMFPresentationClock::RemoveClockStateSink- auf, um die Registrierung des Objekts aufzuheben. Mediensenken verwenden diesen Mechanismus, um Benachrichtigungen von der Uhr zu empfangen.

Präsentationszeiten

Eine Mediensenke versucht, jedes Beispiel so zu planen, dass das Beispiel zur richtigen Zeit oder so nah wie möglich gerendert wird. Die folgenden Definitionen gelten:

  • Präsentationszeit. Die Zeit, zu der ein Beispiel gerendert werden soll. Die Zeit wird in Einheiten von 100 Nanosekunden angegeben.
  • Medienzeit. Zeit relativ zum Anfang des Inhalts. Wenn eine Videodatei beispielsweise 10 Sekunden lang ist, hat der Punkt auf halbem Weg durch die Datei eine Medienzeit von 5 Sekunden.
  • Zeitstempel. Die in einem Medienbeispiel markierte Uhrzeit. Rufen Sie zum Abrufen des Zeitstempels IMFSample::GetSampleTimeauf. Wenn eine Medienquelle ein Beispiel erzeugt, wird der Zeitstempel auf die Medienzeit festgelegt. Die Mediensitzung übersetzt den Zeitstempel in die Präsentationszeit.

Standardmäßig sind Medienzeit und -präsentationszeit identisch, z. B. wenn ein Videoframe 5 Sekunden in der Quelldatei angezeigt wird, die Medienzeit und die Präsentationszeit beide 5 Sekunden. Wenn Sie die Sequencer Sourceverwenden, ist das Timing-Modell etwas komplizierter, um reibungslose Übergänge zwischen Segmenten zu ermöglichen. Weitere Informationen zum Timingmodell der Sequenzquelle finden Sie unter Sequence Presentation Times.

Die Medienquelle legt immer den Zeitstempel gleich der Medienzeit fest. Wenn die Präsentationszeit nicht an der Medienzeit ausgerichtet ist, konvertiert die Mediensitzung die Zeitstempel in den Medienbeispielen. Wenn die Spüle ein Beispiel empfängt, wurde der Zeitstempel des Beispiels in die Präsentationszeit konvertiert. Die Spüle plant das Beispiel mit der aktuellen Uhrzeit der Präsentationsuhr. (Rateless Sinks sind eine Ausnahme, da sie die Präsentationsuhr ignorieren.)

Wenn die Anwendung eine neue Position anstrebt, startet die Mediensitzung die Präsentationsuhr zur angegebenen Suchzeit neu. Wenn die Anwendung beispielsweise die 5-Sekunden-Position in der Datei anstrebt, startet die Mediensitzung die Uhr um 5 Sekunden. Die Medienquelle kann Beispiele mit einem etwas früheren Zeitstempel liefern, wenn die Suchzeit nicht auf eine Keyframegrenze fällt. Dies ist erforderlich, damit die Decoder alle Frames decodieren können. Die Mediensitzung legt Proben ab oder schneidet sie ab, bevor sie die Mediensenken erreichen, um die angeforderte Suchzeit abzugleichen. Wenn die Suchzeit beispielsweise 5 Sekunden beträgt, kann das erste Audiobeispiel mit 4,5 Sekunden beginnen. Die Mediensitzung schneidet die ersten 0,5 Sekunden ab dem ersten decodierten Audiobeispiel ab.

Erstellen der Präsentationsuhr

Rufen Sie zum Erstellen der Präsentationsuhr MFCreatePresentationClockauf. Um die Uhr herunterzufahren, fragen Sie die IMFShutdown Schnittstelle ab, und rufen Sie IMFShutdown::Shutdownauf. Der Anrufer von MFCreatePresentationClock ist für das Anrufen Herunterfahrenverantwortlich; in den meisten Fällen ist dies die Mediensitzung anstelle der Anwendung.

Präsentationszeitquellen

Trotz des Namens implementiert die Präsentationsuhr keine Uhr. Stattdessen ruft es die Uhrzeiten von einem anderen Objekt ab, die als Präsentationszeitquelle bezeichnet. Die Zeitquelle kann ein beliebiges Objekt sein, das genaue Taktstriche generiert und die IMFPresentationTimeSource Schnittstelle verfügbar macht. Die folgende Abbildung zeigt diesen Prozess.

Diagramm mit der Beziehung zwischen der Präsentationsuhr und der Präsentationszeitquelle

Wenn die Präsentationsuhr zum ersten Mal erstellt wird, verfügt sie nicht über eine Zeitquelle. Rufen Sie zum Festlegen der Zeitquelle IMFPresentationClock::SetTimeSource- mit einem Zeiger auf die IMFPresentationTimeSource-Schnittstelle der Zeitquelle auf. Eine Zeitquelle unterstützt dieselben Zustände wie die Präsentationsuhr (wird ausgeführt, angehalten und beendet), und muss die IMFClockStateSink-schnittstelle implementieren. Die Präsentationsuhr verwendet diese Schnittstelle, um die Zeitquelle zu benachrichtigen, wann der Zustand geändert werden soll. Auf diese Weise stellt die Zeitquelle die Takte der Uhr bereit, aber die Präsentationsuhr initiiert Zustandsänderungen in der Uhr.

Einige Mediensenken haben Zugriff auf eine genaue Uhr und machen daher die IMFPresentationTimeSource Schnittstelle verfügbar. Insbesondere kann der Audiorenderer die Häufigkeit der Soundkarte als Uhr verwenden. Bei der Audiowiedergabe ist es hilfreich, dass der Audiorenderer als Zeitquelle fungiert, sodass Video mit der Audiowiedergaberate synchronisiert wird. Dies führt in der Regel zu besseren Ergebnissen als beim Versuch, die Audiodaten mit einer externen Uhr abzugleichen.

Media Foundation stellt außerdem eine Präsentationszeitquelle basierend auf der Systemuhr bereit. Rufen Sie zum Erstellen dieses Objekts MFCreateSystemTimeSourceauf. Die Systemzeitquelle kann verwendet werden, wenn keine Mediensenken eine Zeitquelle bereitstellen.

Im Allgemeinen muss eine Mediensenke die dafür bereitgestellte Präsentationsuhr verwenden, unabhängig davon, welche Zeitquelle die Präsentationsuhr verwendet. Diese Regel gilt auch dann, wenn eine Mediensenke IMFPresentationTimeSource-implementiert. Wenn die Präsentationsuhr eine andere Zeitquelle verwendet, muss die Mediensenke dieser Zeitquelle folgen, nicht der eigenen internen Uhr.

Es gibt zwei Situationen, in denen eine Mediensenke nicht der Präsentationsuhr folgt:

  • Einige Mediensenken sind rateless. Wenn eine Mediensenke ohne Sätze ist, verbraucht sie so schnell wie möglich Beispiele, ohne sie entsprechend der Präsentationsuhr zu planen. In der Regel schreiben ratelose Senken Daten in eine Datei, daher ist es wünschenswert, den Vorgang so schnell wie möglich abzuschließen. Eine zinslose Spüle gibt das MEDIASINK_RATELESS Flag in seiner IMFMediaSink::GetCharacteristics-Methode zurück. Wenn alle Senken in einer Topologie ohne Geschwindigkeit sind, überträgt die Mediensitzung Daten so schnell wie möglich durch die Pipeline.

  • Einige Mediensenken können nicht mit einer anderen Zeitquelle als sich selbst übereinstimmen. Wenn ja, gibt die Spüle das MEDIASINK_CANNOT_MATCH_CLOCK Flag in der GetCharacteristics--Methode zurück. Die Pipeline kann weiterhin eine andere Zeitquelle verwenden, aber die Ergebnisse sind weniger als optimal. Die Spüle fällt wahrscheinlich hinter und verursacht Störungen während der Wiedergabe.

Media Foundation Platform-APIs