Horodatages

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture in Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement que le nouveau code utilise MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation au lieu de DirectShow, si possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]

L’horodatage définit les heures de début et de fin d’un exemple de média, mesurées en temps de flux. L’horodatage est parfois appelé heure de présentation. Lors de la lecture du reste de cet article, il est important de se rappeler que tous les formats n’utilisent pas les horodatages de la même façon. Par exemple, tous les exemples MPEG ne sont pas horodatés. Dans les graphiques de filtre MPEG, l’horodatage n’est pas appliqué à chaque image tant qu’elle n’est pas sortie à partir du décodeur.

Lorsqu’un filtre de convertisseur reçoit un exemple, il planifie le rendu en fonction de l’horodatage. Si l’exemple arrive en retard ou n’a pas d’horodatage, le filtre restitue immédiatement l’exemple. Dans le cas contraire, le filtre attend l’heure de début de l’exemple pour afficher l’exemple. (Il attend l’heure de début en appelant la méthode IReferenceClock::AdviseTime .)

Les filtres sources et les filtres d’analyseur sont chargés de définir les horodatages corrects sur les exemples qu’ils traitent. Suivez les instructions suivantes.

  • Lecture de fichier : le premier exemple est horodaté avec une heure de début de zéro. Les horodatages suivants sont déterminés par la longueur de l’échantillon et le taux de lecture, qui est lui-même déterminé par le format de fichier. Le filtre qui analyse le fichier est responsable du calcul des horodatages corrects (par exemple, le séparateur AVI).
  • Capture vidéo et audio : chaque échantillon est horodaté avec une heure de début égale à l’heure de diffusion lors de sa capture, avec les avertissements suivants :
    • Les images vidéo d’une broche d’aperçu (par opposition à une broche de capture) ne sont pas horodatées. En raison de la latence du graphique, une trame vidéo qui est marquée avec l’heure de capture arrive toujours en retard au convertisseur vidéo. Cela peut entraîner la suppression d’images par le convertisseur, dans le cadre d’une tentative de contrôle qualité. Pour plus d’informations sur le contrôle qualité, consultez Gestion du contrôle qualité.
    • Capture audio : le filtre de capture audio utilise son propre ensemble de mémoires tampons, qui sont distinctes de celles utilisées par le pilote audio. Le pilote audio remplit les mémoires tampons du filtre de capture à intervalles fixes. L’intervalle dépend du pilote, mais n’est généralement pas supérieur à 10 millisecondes. Les horodatages sur les échantillons audio reflètent l’heure à laquelle le pilote a rempli les mémoires tampons du filtre de capture audio. Ces temps peuvent être légèrement inexacts, en particulier si l’application utilise une très petite taille de mémoire tampon. Toutefois, les durées de média reflètent avec précision le nombre d’échantillons audio dans la mémoire tampon.
  • Filtres mux : selon le format de sortie, un filtre mux peut avoir besoin de générer des horodatages, ou non. Par exemple, le format de fichier AVI utilise une fréquence d’images fixe sans horodatage. Par conséquent, le filtre AVI Mux suppose que les échantillons arrivent à peu près au bon moment. Toutefois, si les horodatages entrants affichent un intervalle supérieur à une image, l’avi Mux écrit une entrée d’index avec la taille zéro pour indiquer une image supprimée. Lors de la lecture de fichiers, de nouveaux horodatages sont générés au moment de l’exécution, comme décrit précédemment.

Pour définir l’horodatage sur un exemple, appelez la méthode IMediaSample::SetTime .

Media Times

Si vous le souhaitez, le filtre peut également spécifier une heure de média pour l’exemple. Dans un flux vidéo, l’heure du média représente le numéro d’image. Dans un flux audio, l’heure du média représente le numéro d’exemple dans le paquet. Par exemple, si chaque paquet contient une seconde d’audio de 44,1 kilohertz (kHz), le premier paquet a une heure de début du média de zéro et une heure d’arrêt du média de 44100. Dans un flux pouvant être recherché, l’heure du média est toujours relative à l’heure de début du flux. Par exemple, supposons que vous cherchiez à 2 secondes à partir du début d’un flux vidéo de 15 fps. Le premier exemple de média après la recherche a un horodatage de zéro, mais un temps multimédia de 30.

Les filtres renderer et mux peuvent utiliser la durée du média pour déterminer si des images ou des échantillons ont été supprimés, en vérifiant les lacunes. Toutefois, les filtres ne sont pas nécessaires pour définir l’heure du média. Pour définir l’heure du média sur un exemple, appelez la méthode IMediaSample::SetMediaTime .

Heure et horloges dans DirectShow