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.
- Rufen Sie ZUM Ausführen der Uhr DEN AUFRUF VONPRESENTATIONClock::Start auf. Die Startmethode gibt die Startzeit der Uhr an. Während die Uhr ausgeführt wird, erhöht sich die Uhrzeit von der Startzeit zur aktuellen Taktrate.
- Rufen Sie ZUM Anhalten der Uhr DEN AUFRUF VONPRESENTATIONClock::P ause auf. Während die Uhr angehalten wird, wird die Uhrzeit nicht verschoben, und GetTime gibt die Uhrzeit zurück, zu der die Uhr angehalten wurde.
- Rufen Sie ZUM Beenden der Uhr DEN AUFRUF VONPRESENTATIONClock::Stop auf. Wenn die Uhr beendet wird, wird die Uhrzeit nicht weiterbewegt, und GetTime gibt 0 (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 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.

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.