Präsentationsuhr
Die Präsentationsuhr ist ein Objekt, das die Uhrzeit für eine Präsentation generiert. Die von der Präsentationsuhr gemeldete Zeit wird als Präsentationszeit bezeichnet. Alle Streams 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, ruft sie den Zeitstempel aus der Stichprobe ab und rendert die Stichprobe zum angegebenen Zeitpunkt oder so kurz wie möglich. Da alle Mediensenken in einer Topologie dieselbe Präsentationsuhr verwenden, werden mehrere Datenströme (z. B. Audio und Video) synchronisiert. Medienquellen und Transformationen verwenden nicht die Präsentationsuhr, da sie nicht planen, wann Beispiele übermittelt werden sollen. Stattdessen erstellen sie Beispiele, wenn die Pipeline ein neues Beispiel anfordert.
Wenn Sie die Mediensitzung für die Wiedergabe verwenden, verarbeitet die Mediensitzung alle Details zum Erstellen der Präsentationsuhr, zum Auswählen einer Zeitquelle und zum Benachrichtigen der Mediensenken. Ihre Anwendung verwendet möglicherweise die Präsentationsuhr, um die aktuelle Präsentationszeit während der Wiedergabe abzurufen, ruft aber andernfalls keine Methoden für die Präsentationsuhr auf.
Uhrzeit und Uhrzeitstatus
Um die neueste Uhrzeit von der Präsentationsuhr abzurufen, rufen Sie IMFPresentationClock::GetTime auf. Die Taktzeiten liegen immer in Einheiten von 100 Nanosekunden, sodass eine Sekunde 10.000.000 (10^7) Ticks beträgt. Dies entspricht einer Frequenz von 10 MHz.
Die Präsentationsuhr weist drei Zustände auf: Wird ausgeführt, angehalten und beendet.
- Um die Uhr auszuführen, rufen Sie IMFPresentationClock::Start auf. Die Start-Methode gibt die Startzeit der Uhr an. Während die Uhr ausgeführt wird, erhöht sich die Uhrzeit von der Startzeit zur aktuellen Taktrate.
- Um die Uhr anzuhalten, rufen Sie IMFPresentationClock::P ause auf. Während die Uhr angehalten ist, geht die Uhrzeit nicht voran, und GetTime gibt den Zeitpunkt zurück, zu dem die Uhr angehalten wurde.
- Um die Uhr zu beenden, rufen Sie IMFPresentationClock::Stop auf. Wenn die Uhr beendet wird, wird die Uhrzeit nicht erweitert, und GetTime gibt null zurück.
Standardmäßig bewegt sich die Uhr mit einer Rate von 1,0, d. h. 1 Tick pro 100 Nanosekunden. Um die Geschwindigkeit zu ändern, mit der sich die Uhr bewegt, fragen Sie die Präsentationsuhr für die IMFRateControl-Schnittstelle ab, und rufen Sie IMFRateControl::SetRate auf.
Objekte können Benachrichtigungen über Zustandsänderungen (einschließlich Ratenä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 zum richtigen Zeitpunkt oder so nah wie möglich an der richtigen Zeit gerendert wird. Es gelten die folgenden Definitionen:
- Präsentationszeit. Der Zeitpunkt, zu dem ein Beispiel gerendert werden soll. Die Zeit wird in Einheiten von 100 Nanosekunden angegeben.
- Medienzeit. Zeit relativ zum Anfang des Inhalts. Wenn z. B. eine Videodatei 10 Sekunden lang ist, hat der Punkt in der Mitte der Datei eine Medienzeit von 5 Sekunden.
- Zeitstempel. Die in einem Medienbeispiel markierte Zeit. Rufen Sie zum Abrufen des Zeitstempels IMFSample::GetSampleTime auf. Wenn eine Medienquelle ein Beispiel erzeugt, wird der Zeitstempel der Medienzeit festgelegt. Die Mediensitzung übersetzt den Zeitstempel in die Präsentationszeit.
Standardmäßig sind Medienzeit und Präsentationszeit identisch. Wenn beispielsweise ein Videoframe 5 Sekunden in der Quelldatei angezeigt wird, beträgt die Medienzeit und die Präsentationszeit jeweils 5 Sekunden. Wenn Sie die Sequencer-Quelle verwenden, ist das Zeitsteuerungsmodell etwas komplizierter, um reibungslose Übergänge zwischen Segmenten zu ermöglichen. Weitere Informationen zum Timingmodell der Sequenzerquelle finden Sie unter Sequenzpräsentationszeiten.
Die Medienquelle legt den Zeitstempel immer gleich der Medienzeit fest. Wenn die Präsentationszeit nicht an der Medienzeit ausgerichtet ist, konvertiert die Mediensitzung die Zeitstempel in den Medienbeispielen. Wenn die Senke ein Beispiel empfängt, wurde der Zeitstempel des Beispiels in die Präsentationszeit konvertiert. Die Senke plant das Beispiel anhand der aktuellen Uhrzeit der Präsentationsuhr. (Ratenlose Senken 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 mit 5 Sekunden. Die Medienquelle liefert möglicherweise Beispiele mit einem etwas früheren Zeitstempel, wenn die Suchzeit nicht auf eine Keyframe-Grenze fällt. Dies ist erforderlich, damit die Decoder alle Frames decodieren können. Die Mediensitzung löscht oder schneidet Beispiele, bevor sie die Mediensenken erreichen, um die angeforderte Suchzeit zu erfüllen. Wenn die Suchzeit beispielsweise 5 Sekunden beträgt, kann das erste Audiobeispiel bei 4,5 Sekunden beginnen. Die Mediensitzung schneidet die ersten 0,5 Sekunden vom ersten decodierten Audiobeispiel ab.
Erstellen der Präsentationsuhr
Um die Präsentationsuhr zu erstellen, rufen Sie MFCreatePresentationClock auf. Um die Uhr herunterzufahren, fragen Sie die IMFShutdown-Schnittstelle ab, und rufen Sie IMFShutdown::Shutdown auf. Der Aufrufer von MFCreatePresentationClock ist für den Aufruf von Shutdown verantwortlich; in den meisten Fällen ist dies die Mediensitzung und nicht die Anwendung.
Präsentationszeitquellen
Trotz ihres Namens implementiert die Präsentationsuhr keine Uhr. Stattdessen werden die Uhrzeiten von einem anderen Objekt abgerufen, das als Präsentationszeitquelle bezeichnet wird. Die Zeitquelle kann ein beliebiges Objekt sein, das genaue Takttakte generiert und die IMFPresentationTimeSource-Schnittstelle verfügbar macht. Die folgende Abbildung veranschaulicht diesen Prozess.
Wenn die Präsentationsuhr zum ersten Mal erstellt wird, verfügt sie nicht über eine Zeitquelle. Um die Zeitquelle festzulegen, rufen Sie 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 Frequenz des Sounds Karte als Uhr nutzen. 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 der Versuch, die Audiodaten einer externen Uhr zuzuordnen.
Media Foundation stellt auch eine Präsentationszeitquelle basierend auf der Systemuhr bereit. Um dieses Objekt zu erstellen, rufen Sie MFCreateSystemTimeSource auf. 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 ihrer eigenen internen Uhr.
Es gibt zwei Situationen, in denen eine Mediensenke nicht der Präsentationsuhr folgt:
Einige Mediensenken sind ohne Geschwindigkeit. Wenn eine Mediensenke ratenlos ist, werden Proben so schnell wie möglich verbraucht, ohne sie entsprechend der Präsentationsuhr zu planen. In der Regel schreiben ratenlose Senken Daten in eine Datei, sodass es wünschenswert ist, den Vorgang so schnell wie möglich abzuschließen. Eine rateless-Senke gibt das MEDIASINK_RATELESS-Flag in der IMFMediaSink::GetCharacteristics-Methode zurück. Wenn alle Senken in einer Topologie ratenlos sind, werden die Daten von der Mediensitzung so schnell wie möglich durch die Pipeline gepusht.
Einige Mediensenken können die Raten nicht mit einer anderen Zeitquelle als sich selbst abgleichen. Wenn ja, gibt die Senke das MEDIASINK_CANNOT_MATCH_CLOCK-Flag in ihrer GetCharacteristics-Methode zurück. Die Pipeline kann weiterhin eine andere Zeitquelle verwenden, aber die Ergebnisse sind nicht optimal. Die Senke fällt wahrscheinlich zurück und verursacht Störungen während der Wiedergabe.
Zugehörige Themen