Partager via


Définition et récupération de la position

[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est 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.]

Le graphe de filtre conserve deux valeurs de position, la position actuelle et la position d’arrêt. Celles-ci sont définies comme suit :

  • Lorsque le graphique est en cours d’exécution, la position actuelle est la position de lecture actuelle, par rapport au début de la source. Lorsque le graphe est arrêté ou suspendu, la position actuelle est le point où la diffusion en continu commencera lors de la commande d’exécution suivante.
  • La position d’arrêt est le point où le flux se termine. Lorsque le graphe atteint la position d’arrêt, plus aucune donnée n’est diffusée en continu et le gestionnaire de graphiques de filtre publie un événement EC_COMPLETE . (Toutefois, le graphique ne passe pas automatiquement à un état arrêté. Pour plus d’informations, consultez Réponse aux événements.)

Pour récupérer ces valeurs, appelez la méthode IMediaSeeking::GetPositions . Les valeurs retournées sont toujours relatives à la source multimédia d’origine. Par défaut, les valeurs sont en unités de temps de référence. Dans certains cas, vous pouvez modifier les unités de temps ; Pour plus d’informations, consultez Formats d’heure pour les commandes Seek.

Pour rechercher une nouvelle position ou définir une nouvelle position d’arrêt, appelez la méthode IMediaSeeking::SetPositions , comme illustré dans l’exemple suivant :

#define ONE_SECOND 10000000
REFERENCE_TIME rtNow  = 2 * ONE_SECOND, 
               rtStop = 5 * ONE_SECOND;

hr = pSeek->SetPositions(
    &rtNow,  AM_SEEKING_AbsolutePositioning, 
    &rtStop, AM_SEEKING_AbsolutePositioning
    );

Notes

Une seconde correspond à 10 000 000 unités de temps de référence. Par souci de commodité, l’exemple définit cette valeur comme ONE_SECOND. Si vous utilisez la bibliothèque de classe de base DirectShow, la constante UNITS a la même valeur.

 

Le paramètre rtNow spécifie la nouvelle position actuelle. Le deuxième paramètre est un indicateur qui définit l’interprétation de rtNow. Dans cet exemple, l’indicateur AM_SEEKING_AbsolutePositioning indique que rtNow spécifie une position absolue dans la source. Par conséquent, le graphe de filtre recherche une position deux secondes à partir du début du flux. Le paramètre rtStop donne l’heure d’arrêt. Le dernier paramètre spécifie que rtStop est également une position absolue.

Pour spécifier une position par rapport à la valeur de position précédente, utilisez l’indicateur AM_SEEKING_RelativePositioning. Pour laisser l’une des valeurs de position inchangées, utilisez l’indicateur AM_SEEKING_NoPositioning. Le paramètre d’heure correspondant peut être NULL dans ce cas. L’exemple suivant recherche vers l’avant de 10 secondes, mais laisse la position d’arrêt inchangée :

REFERENCE_TIME rtNow = 10 * ONE_SECOND;
hr = pSeek->SetPositions(
    &rtNow, AM_SEEKING_RelativePositioning, 
    NULL, AM_SEEKING_NoPositioning
    );

Si le graphe de filtre est arrêté, le convertisseur vidéo ne met pas à jour l’image après une opération de recherche. Pour l’utilisateur, il s’affiche comme si la recherche n’a pas eu lieu. Pour mettre à jour l’image, suspendez le graphique après l’opération de recherche. La suspension du graphique indique une nouvelle image vidéo pour le convertisseur vidéo. Vous pouvez utiliser la méthode IMediaControl::StopWhenReady , qui interrompt le graphe, puis l’arrête.