Share via


Obtention du timecode à partir de l’appareil

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

Pendant la lecture d’une bande DV ou en mode pause d’enregistrement, vous pouvez récupérer le code temporel SMPTE ou le numéro de piste absolu. Pour ce faire, appelez la méthode IAMTimecodeReader::GetTimecode . Cette méthode prend un pointeur vers une structure TIMECODE_SAMPLE , qui décrit le code temporel. Avant d’appeler la méthode, initialisez le membre dwFlags de la structure. Utilisez la valeur ED_DEVCAP_TIMECODE_READ pour récupérer le code temporel ou la valeur ED_DEVCAP_ATN_READ pour récupérer le numéro de piste absolu.

Le membre timecode de la structure TIMECODE_SAMPLE est une structure TIMECODE. Lorsque la méthode retourne, le membre dwFrames de la structure TIMECODE contient le code temporel ou le numéro de piste. Pour timecode, les heures, les minutes, les secondes et les images sont empaquetées dans un DWORD en tant que valeurs décimales codées binaires (BCD), au format hhmmssff. Utilisez des masque de bits pour extraire les valeurs individuelles.

L’exemple suivant récupère le code temporel et le numéro de piste.

if (MyDevCap.bHasTimecode)
{
    TIMECODE_SAMPLE TimecodeSample;
    TimecodeSample.timecode.dwFrames = 0;
    char szBuf[32];

    TimecodeSample.dwFlags = ED_DEVCAP_TIMECODE_READ;
    if (hr = MyDevCap.pTimecode->GetTimecode(&TimecodeSample),  SUCCEEDED(hr)) 
    {
        DWORD dwTime = TimecodeSample.timecode.dwFrames; // Packed BCD value.
        int hour  = ((dwTime & 0x0F000000) >> 24) + 
                    (10 * ((dwTime & 0xF0000000) >> 28));
        int min   = ((dwTime & 0x0F0000) >> 16) + 
                    (10 * ((dwTime & 0xF00000) >> 20));
        int sec   = ((dwTime & 0x0F00) >> 8) + 
                    (10 * ((dwTime & 0xF000) >> 12));
        int frame = (dwTime & 0x0F) + 
                    (10 * ((dwTime & 0xF0) >> 4));
    }

    TimecodeSample.dwFlags = ED_DEVCAP_ATN_READ;
    if (hr = MyDevCap.pTimecode->GetTimecode(&TimecodeSample), SUCCEEDED(hr)) 
    {
        DWORD dwTrackNumber = TimecodeSample.timecode.dwFrames;
    }
}

Contrôle d’un caméscope DV