Partager via


Horloge de présentation

L’horloge de présentation est un objet qui génère l’heure de l’horloge d’une présentation. L’heure signalée par l’horloge de présentation est appelée heure de présentation. Tous les flux d’une présentation sont synchronisés avec l’heure de présentation. L’horloge de présentation expose les interfaces suivantes.

Interface Description
IMFPresentationClock Interface principale pour l’utilisation de l’horloge de présentation.
IMFRateControl Contrôle le taux d’horloge.
IMFTimer Fournit un rappel du minuteur.
IMFShutdown Arrête l’horloge de présentation.

 

Les récepteurs multimédias utilisent l’heure de présentation pour planifier le rendu des exemples. Chaque fois qu’un récepteur multimédia reçoit un nouvel échantillon, il obtient l’horodatage de l’échantillon et affiche l’échantillon à l’heure indiquée, ou le plus proche possible de cette heure. Étant donné que tous les récepteurs multimédias d’une topologie partagent la même horloge de présentation, plusieurs flux (tels que l’audio et la vidéo) sont synchronisés. Les sources et transformations multimédias n’utilisent pas l’horloge de présentation, car elles ne planifient pas la livraison d’échantillons. Au lieu de cela, ils produisent des échantillons chaque fois que le pipeline demande un nouvel exemple.

Si vous utilisez la session multimédia pour la lecture, la session multimédia gère tous les détails de la création de l’horloge de présentation, en sélectionnant une source de temps et en informant les récepteurs multimédias. Votre application peut utiliser l’horloge de présentation pour obtenir l’heure de présentation actuelle pendant la lecture, mais sinon n’appelle aucune méthode sur l’horloge de présentation.

Heure de l’horloge et états de l’horloge

Pour obtenir la dernière heure de l’horloge à partir de l’horloge de présentation, appelez IMFPresentationClock ::GetTime. Les heures d’horloge sont toujours en unités de 100 nanosecondes, donc une seconde est de 10 000 000 cycles (10^7). Cela correspond à une fréquence de 10 MHz.

L’horloge de présentation a trois états : En cours d’exécution, suspendu et arrêté.

  • Pour exécuter l’horloge, appelez IMFPresentationClock ::Start. La méthode Start spécifie l’heure de début de l’horloge. Pendant que l’horloge est en cours d’exécution, l’heure d’horloge s’incrémente de l’heure de départ, à la fréquence d’horloge actuelle.
  • Pour suspendre l’horloge, appelez IMFPresentationClock ::P ause. Pendant que l’horloge est suspendue, l’heure de l’horloge n’avance pas et GetTime retourne l’heure à laquelle l’horloge a été suspendue.
  • Pour arrêter l’horloge, appelez IMFPresentationClock ::Stop. Lorsque l’horloge est arrêtée, l’heure de l’horloge n’avance pas et GetTime retourne zéro.

Par défaut, l’horloge avance à un taux de 1,0, ce qui signifie 1 graduation par 100 nanosecondes. Pour modifier la fréquence à laquelle l’horloge avance, interrogez l’horloge de présentation pour l’interface IMFRateControl et appelez IMFRateControl ::SetRate.

Les objets peuvent recevoir des notifications de modifications d’état (y compris les modifications de taux) de l’horloge de présentation. Pour recevoir des notifications, implémentez l’interface IMFClockStateSink et appelez IMFPresentationClock ::AddClockStateSink sur l’horloge de présentation. Avant de s’arrêter, appelez IMFPresentationClock ::RemoveClockStateSink pour annuler l’inscription de l’objet. Les récepteurs multimédias utilisent ce mécanisme pour recevoir des notifications de l’horloge.

Heures de présentation

Un récepteur multimédia tente de planifier chaque échantillon afin que l’échantillon soit rendu au bon moment, ou aussi près du bon moment que possible. Les définitions suivantes s’appliquent :

  • Heure de présentation. Heure à laquelle un échantillon doit être rendu. Le temps est donné en unités de 100 nanosecondes.
  • Heure du média. Heure relative au début du contenu. Par exemple, si un fichier vidéo est long de 10 secondes, le point à mi-chemin du fichier a une durée multimédia de 5 secondes.
  • Horodatage. Heure marquée sur un exemple de média. Pour obtenir l’horodatage, appelez IMFSample ::GetSampleTime. Lorsqu’une source multimédia produit un exemple, elle définit l’horodatage égal à l’heure du média. La session multimédia traduit l’horodatage en heure de présentation.

Par défaut, le temps multimédia et l’heure de présentation sont identiques, par exemple, si une trame vidéo apparaît 5 secondes dans le fichier source, l’heure du média et l’heure de présentation sont toutes deux de 5 secondes. Si vous utilisez la Source Sequencer, le modèle de minutage est un peu plus compliqué pour permettre des transitions fluide entre les segments. Pour plus d’informations sur le modèle de minutage de la source sequencer, consultez Temps de présentation de séquence.

La source multimédia définit toujours l’horodatage égal à l’heure du média. Si l’heure de présentation n’est pas alignée sur l’heure du média, la session multimédia convertit les horodatages sur les exemples multimédias. Au moment où le récepteur reçoit un échantillon, l’horodatage de l’échantillon a été converti en heure de présentation. Le récepteur planifie l’exemple par rapport à l’heure actuelle de l’horloge de présentation. (Les récepteurs sans débit sont une exception, car ils ignorent l’horloge de présentation.)

Si l’application recherche une nouvelle position, la session multimédia redémarre l’horloge de présentation à l’heure de recherche spécifiée. Par exemple, si l’application recherche la position de 5 secondes dans le fichier, la session multimédia démarre l’horloge à 5 secondes. La source multimédia peut fournir des exemples avec un horodatage légèrement antérieur si l’heure de recherche ne tombe pas sur une limite de trame clé. Cela est nécessaire pour que les décodeurs puissent décoder toutes les images. La session multimédia supprime ou supprime des échantillons avant d’atteindre les récepteurs multimédias afin de correspondre au temps de recherche demandé. Par exemple, si la durée de recherche est de 5 secondes, le premier échantillon audio peut démarrer à 4,5 secondes. La session multimédia supprime les 0,5 premières secondes du premier exemple audio décodé.

Création de l’horloge de présentation

Pour créer l’horloge de présentation, appelez MFCreatePresentationClock. Pour arrêter l’horloge, interrogez l’interfaceIMFShutdown et appelez IMFShutdown ::Shutdown. L’appelant de MFCreatePresentationClock est chargé d’appeler d’arrêt ; dans la plupart des cas, il s’agit de la session multimédia plutôt que de l’application.

Sources de temps de présentation

Malgré son nom, l’horloge de présentation n’implémente pas réellement une horloge. Au lieu de cela, il obtient les heures d’horloge d’un autre objet, appelée source de l’heure de présentation. La source de temps peut être n’importe quel objet qui génère des cycles d’horloge précis et expose l’interface IMFPresentationTimeSource. L’illustration suivante montre ce processus.

diagramme montrant la relation entre l’horloge de présentation et la source de l’heure de présentation

Lorsque l’horloge de présentation est créée pour la première fois, elle n’a pas de source d’heure. Pour définir la source de temps, appelez IMFPresentationClock ::SetTimeSource avec un pointeur vers l’interface IMFPresentationTimeSource de la source de temps. Une source de temps prend en charge les mêmes états que l’horloge de présentation (en cours d’exécution, suspendu et arrêt) et doit implémenter l’interface IMFClockStateSink. L’horloge de présentation utilise cette interface pour notifier la source d’heure quand changer d’état. De cette façon, la source de temps fournit les cycles d’horloge, mais l’horloge de présentation lance les modifications d’état dans l’horloge.

Certains récepteurs multimédias ont accès à une horloge précise et exposent donc l’interface IMFPresentationTimeSource. En particulier, le convertisseur audio peut utiliser la fréquence de la carte audio comme horloge. Dans la lecture audio, il est utile que le convertisseur audio agisse comme source de temps, afin que la vidéo soit synchronisée avec le taux de lecture audio. Cela produit généralement de meilleurs résultats que de tenter de faire correspondre l’audio à une horloge externe.

Media Foundation fournit également une source de temps de présentation basée sur l’horloge système. Pour créer cet objet, appelez MFCreateSystemTimeSource. La source de temps système peut être utilisée lorsqu’aucun récepteur multimédia ne fournit une source de temps.

En général, un récepteur multimédia doit utiliser l’horloge de présentation fournie à celui-ci, quelle que soit l’heure utilisée par l’horloge de présentation. Cette règle s’applique même lorsqu’un récepteur multimédia implémente IMFPresentationTimeSource. Si l’horloge de présentation utilise une autre source de temps, le récepteur multimédia doit suivre cette source de temps, et non son propre horloge interne.

Il existe deux situations où un récepteur multimédia ne suit pas l’horloge de présentation :

  • Certains récepteurs multimédias sont sans débit. Si un récepteur multimédia est sans débit, il consomme des échantillons aussi rapidement que possible, sans les planifier en fonction de l’horloge de présentation. En règle générale, les récepteurs sans débit écrivent des données dans un fichier. Il est donc souhaitable d’effectuer l’opération le plus rapidement possible. Un récepteur sans taux retourne l’indicateur MEDIASINK_RATELESS dans sa méthode IMFMediaSink ::GetCharacteristics méthode. Lorsque tous les récepteurs d’une topologie sont sans débit, la session multimédia envoie des données au pipeline le plus rapidement possible.

  • Certains récepteurs multimédias ne peuvent pas correspondre aux taux avec une source de temps autre qu’eux-mêmes. Dans ce cas, le récepteur retourne l’indicateur MEDIASINK_CANNOT_MATCH_CLOCK dans sa méthode GetCharacteristics. Le pipeline peut toujours utiliser une autre source de temps, mais les résultats seront inférieurs à optimaux. Le récepteur tombera probablement derrière et provoquera des glissures pendant la lecture.

API Media Foundation Platform