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 Datenströme in einer Präsentation werden mit der Präsentationszeit synchronisiert. Die Präsentationsuhr macht die folgenden Schnittstellen verfügbar.

Schnittstelle BESCHREIBUNG
PRESENTPresentationClock Primäre Schnittstelle für die Verwendung der Präsentationsuhr.
THICKNESSRateControl Steuert die Taktrate.
ÜBERGEHENTIMER Stellt einen Timerrückruf bereit.
ÜBERBRÜCKUNGSHUTDOWN Fährt die Präsentationsuhr herunter.

Mediensenken verwenden die Präsentationszeit, um den Zeitpunkt für das Rendern von Beispielen zu planen. 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 nah wie möglich an dieser Zeit. 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 Immer dann Stichproben, 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 kann die Präsentationsuhr verwenden, um die aktuelle Präsentationszeit während der Wiedergabe abzurufen, aber andernfalls werden keine Methoden für die Präsentationsuhr aufgerufen.

Uhrzeit- und Uhrzustände

Rufen Sie ZUM Abrufen der aktuellen Uhrzeit aus der Präsentationsuhr DEN AUFRUF VONPRESENTPRESENTATIONClock::GetTimeauf. Die Uhrzeiten liegen immer in Einheiten von 100 Nanosekunden vor, 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.

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 entwickelt, fragen Sie die Präsentationsuhr für die INTERFACESRateControl-Schnittstelle ab, und rufen Sie DANN DIE RATE::SetRateauf.

Objekte können Benachrichtigungen über Zustandsänderungen (einschließlich Änderungen der Geschwindigkeit) von der Präsentationsuhr empfangen. Implementieren Sie zum Empfangen von Benachrichtigungen die INTERFACESClockStateSink-Schnittstelle, und rufen Sie AUF DER Präsentationsuhr DEN AUFRUF VONPRESENTPRESENTATIONClock::AddClockStateSink auf. Rufen Sie vor dem Herunterfahren DEN AUFRUF VONPRESENTATIONClock::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 eine Videodatei beispielsweise 10 Sekunden lang ist, hat der Punkt in der Mitte der Datei eine Medienzeit von 5 Sekunden.
  • Zeitstempel. Die Zeit, die für ein Medienbeispiel markiert ist. Rufen Sie ZUM Abrufen des Zeitstempels DEN AUFRUF VONSAMPLE::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 die Medienzeit und die Präsentationszeit identisch. Wenn z. B. ein Videoframe 5 Sekunden in der Quelldatei angezeigt wird, beträgt die Medienzeit und die Präsentationszeit jeweils 5 Sekunden. Wenn Sie die Sequencer-Quelleverwenden, ist das Zeitsteuerungsmodell etwas komplizierter, um reibungslose Übergänge zwischen Segmenten zu ermöglichen. Weitere Informationen zum Zeitsteuerungsmodell der Sequencerquelle finden Sie unter Sequence Presentation Times.

Die Medienquelle legt den Zeitstempel immer auf die Medienzeit fest. Wenn die Präsentationszeit nicht an der Medienzeit ausgerichtet ist, konvertiert die Mediensitzung die Zeitstempel für die Medienbeispiele. Zu dem Zeitpunkt, zu dem die Senke ein Beispiel empfängt, wurde der Zeitstempel der Stichprobe 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 um 5 Sekunden. Die Medienquelle kann Stichproben mit einem etwas früheren Zeitstempel übermitteln, wenn die Suchzeit nicht auf eine Keyframegrenze fällt. Dies ist erforderlich, damit die Decoder alle Frames decodieren können. Die Mediensitzung löscht oder kürzet Stichproben, bevor sie die Mediensenken erreichen, um der angeforderten Suchzeit zu entsprechen. Wenn die Suchzeit beispielsweise 5 Sekunden beträgt, kann das erste Audiobeispiel bei 4,5 Sekunden beginnen. Die Mediensitzung entfernt die ersten 0,5 Sekunden aus dem ersten decodierten Audiobeispiel.

Erstellen der Präsentationsuhr

Um die Präsentationsuhr zu erstellen, rufen Sie MFCreatePresentationClockauf. Um die Uhr herunterzufahren, fragen Sie nach der SCHNITTSTELLE FÜRShutdown ab, und rufen Sie DEN AUFRUF VONShutdown::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 aus einem anderen Objekt abgerufen, das als Präsentationszeitquelle bezeichnet wird. Die Zeitquelle kann ein beliebiges Objekt sein, das genaue Takte generiert und die INTERFACESPresentationTimeSource-Schnittstelle verfügbar macht. Die folgende Abbildung veranschaulicht diesen Prozess.

Diagramm, das die Beziehung zwischen der Präsentationsuhr und der Quelle der Präsentationszeit zeigt

Wenn die Präsentationsuhr zum ersten Mal erstellt wird, verfügt sie nicht über eine Zeitquelle. Um die Zeitquelle festzulegen, rufen Sie DEN CURSORPresentationClock::SetTimeSource mit einem Zeiger auf die SCHNITTSTELLE "POINTERPresentationTimeSource" der Zeitquelle auf. Eine Zeitquelle unterstützt die gleichen Zustände wie die Präsentationsuhr (wird ausgeführt, angehalten und beendet) und muss die SCHNITTSTELLE VONClockStateSink 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 SCHNITTSTELLE "PRESENTPresentationTimeSource" verfügbar. Insbesondere kann der Audiorenderer die Frequenz der Soundkarte als Uhr verwenden. Bei der Audiowiedergabe ist es nützlich, dass der Audiorenderer als Zeitquelle fungiert, damit das Video mit der Audiowiedergaberate synchronisiert wird. Dies führt im Allgemeinen zu besseren Ergebnissen als der Versuch, die Audiodaten mit einer externen Uhr abzugleichen.

Media Foundation stellt auch eine Präsentationszeitquelle basierend auf der Systemuhr bereit. Um dieses Objekt zu erstellen, rufen Sie MFCreateSystemTimeSourceauf. Die Systemzeitquelle kann verwendet werden, wenn keine Mediensenken eine Zeitquelle bereitstellen.

Im Allgemeinen muss eine Mediensenke die bereitgestellte Präsentationsuhr verwenden, unabhängig davon, welche Zeitquelle die Präsentationsuhr verwendet. Diese Regel gilt auch dann, wenn eine Mediensenke DENKPRESENTATIONTimeSourceimplementiert. 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 ratenlos. Wenn eine Mediensenke ratenlos ist, werden Stichproben so schnell wie möglich verwendet, ohne sie entsprechend der Präsentationsuhr zu planen. In der Regel schreiben ratlose Senken Daten in eine Datei, daher ist es wünschenswert, den Vorgang so schnell wie möglich abzuschließen. Eine rateless-Senke gibt das MEDIASINK RATELESS-Flag in der METHODE FÜR DIE 100- und 10-Prozent-Rate _ (RATELESS) in der METHODE "FALSEMediaSink::GetCharacteristics" zurück. Wenn alle Senken in einer Topologie ratelos sind, überträgt die Mediensitzung Daten so schnell wie möglich über die Pipeline.

  • Einige Mediensenken können raten nicht mit einer anderen Zeitquelle als sich selbst übereinstimmen. Wenn dies der Wert ist, gibt die Senke das FLAG MEDIASINK _ CANNOT MATCH CLOCK in der _ _ GetCharacteristics-Methode zurück. Die Pipeline kann weiterhin eine andere Zeitquelle verwenden, aber die Ergebnisse sind weniger als optimal. Die Senke fällt wahrscheinlich zurück und verursacht während der Wiedergabe Störungen.

Media Foundation Plattform-APIs