Partager via


Formats de temps pour les commandes Seek

[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.]

La plupart des méthodes de l’interface IMediaSeeking ont des paramètres qui expriment des valeurs de position, telles que la position actuelle ou la position d’arrêt. Par défaut, ces paramètres sont exprimés en unités de 100 nanosecondes, également appelée temps de référence. Tout filtre qui peut rechercher doit prendre en charge la recherche par heure de référence. Certains filtres peuvent également utiliser d’autres unités de temps, telles que la recherche d’un numéro d’image particulier ou la recherche d’un décalage d’octets donné dans un flux. Chacune de ces unités de temps est appelée format d’heure et est définie par un identificateur global unique (GUID). Pour obtenir la liste des formats d’heure définis par DirectShow, consultez GUID de format de temps. Les tiers peuvent également définir des GUID pour les formats de temps personnalisés.

Pour déterminer si les filtres actuellement dans le graphique de filtres prennent en charge un format d’heure particulier, appelez la méthode IMediaSeeking::IsFormatSupported . La méthode retourne S_OK si le format est pris en charge. Sinon, elle retourne S_FALSE ou un code d’erreur. Si un format est pris en charge, vous pouvez basculer vers ce format en appelant la méthode IMediaSeeking::SetTimeFormat . Si la méthode SetTimeFormat réussit, les commandes de recherche suivantes sont exprimées à l’aide du nouveau format d’heure.

L’exemple suivant vérifie si le graphique prend en charge la recherche par numéro de trame. Si c’est le cas, il cherche à cadrer le numéro 20 :

hr = pSeek->IsFormatSupported(&TIME_FORMAT_FRAME);
if (hr == S_OK)
{
    hr = pSeek->SetTimeFormat(&TIME_FORMAT_FRAME);
    if (SUCCEEDED(hr))
    {
        // Seek to frame number 20.
        LONGLONG rtNow = 20;
        hr = pSeek->SetPositions(
            &rtNow, AM_SEEKING_AbsolutePositioning, 
            0, AM_SEEKING_NoPositioning);
    }
}

Notez que les formats d’heure s’appliquent uniquement aux commandes de recherche. Elles n’affectent pas la lecture du graphique ou d’autres actions.