Horloge de présentation
L’horloge de présentation est un objet qui génère l’heure d’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 la fréquence 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’exemple et le restitue à l’heure indiquée, ou aussi près que 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 (par exemple, audio et vidéo) sont synchronisés. Les sources multimédias et les transformations n’utilisent pas l’horloge de présentation, car elles ne planifient pas quand remettre des exemples. 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, de la sélection d’une source d’heure et de la notification des 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 dans le cas contraire, elle n’appelle aucune méthode sur l’horloge de la présentation.
Heure de l’horloge et états de l’horloge
Pour obtenir la dernière heure de l’horloge de la présentation, appelez IMFPresentationClock::GetTime. Les heures d’horloge sont toujours en unités de 100 nanosecondes, donc une seconde correspond à 10 000 000 (10^7) cycles. Cela correspond à une fréquence de 10 MHz.
L’horloge de présentation a trois états : En cours d’exécution, en pause 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 de l’horloge s’incrémente à partir de l’heure de début, à la fréquence d’horloge actuelle.
- Pour suspendre l’horloge, appelez IMFPresentationClock::P ause. Pendant que l’horloge est suspendue, l’heure d’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 d’horloge n’avance pas et GetTime retourne zéro.
Par défaut, l’horloge avance à une vitesse de 1,0, ce qui signifie 1 graduation par 100 nanosecondes. Pour modifier la vitesse à 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 des changements de taux) à partir 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 l’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 exemple afin que l’exemple 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 exemple doit être rendu. Le temps est donné en unités de 100 nanosecondes.
- Heure du média. Temps relatif au début du contenu. Par exemple, si un fichier vidéo dure 10 secondes, le temps multimédia est de 5 secondes au milieu du fichier.
- 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, l’heure du média et l’heure de présentation sont identiques. Par exemple, si une image vidéo apparaît 5 secondes dans le fichier source, l’heure du média et la durée 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 fluides entre les segments. Pour plus d’informations sur le modèle de minutage de la source du séquenceur, consultez Durées de présentation de séquence.
La source du mé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 constituent 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 cherche à atteindre 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 échantillons avec un horodatage légèrement antérieur si l’heure de recherche ne se situe pas sur une limite d’image clé. Cela est nécessaire pour que les décodeurs puissent décoder toutes les trames. La session multimédia supprime ou supprime les échantillons avant qu’ils n’atteignent les récepteurs multimédias, afin de correspondre à l’heure de recherche demandée. Par exemple, si le temps de recherche est de 5 secondes, le premier échantillon audio peut commencer à 4,5 secondes. La session multimédia supprime les 0,5 premières secondes à partir 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’interface IMFShutdown et appelez IMFShutdown::Shutdown. L’appelant de MFCreatePresentationClock est responsable de l’appel de l’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 d’horloge. Au lieu de cela, il obtient les heures d’horloge à partir d’un autre objet, appelé source d’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 ci-dessous montre ce processus.
Lorsque l’horloge de présentation est créée pour la première fois, elle n’a pas de source de temps. Pour définir la source d’heure, 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, en pause et arrêt) et doit implémenter l’interface IMFClockStateSink . L’horloge de présentation utilise cette interface pour informer la source d’heure du changement d’état. De cette façon, la source de temps fournit les cycles de l’horloge, mais l’horloge de présentation initie des changements 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 du son carte comme horloge. Dans la lecture audio, il est utile pour le convertisseur audio d’agir 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 d’essayer de faire correspondre l’audio à une horloge externe.
Media Foundation fournit également une source d’heure 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 de source de temps.
En général, un récepteur multimédia doit utiliser l’horloge de présentation qui lui est fournie, quelle que soit la source d’heure utilisée par l’horloge de présentation. Cette règle s’applique même lorsqu’un récepteur de mé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 sa 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 aussi rapidement que possible. Un récepteur sans taux retourne l’indicateur MEDIASINK_RATELESS dans sa méthode IMFMediaSink::GetCharacteristics . Lorsque tous les récepteurs d’une topologie sont sans débit, la session multimédia envoie les données via le pipeline aussi rapidement que possible.
Certains récepteurs multimédias ne peuvent pas faire correspondre les taux à une autre source de temps qu’eux-mêmes. Si c’est le 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 ne sont pas optimaux. Le récepteur prendra probablement du retard et provoquera des problèmes lors de la lecture.
Rubriques connexes