Recupero del codice temporale dal dispositivo

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Mentre un nastro DV viene riprodotto o è in modalità di sospensione record, è possibile recuperare il codice di tempo SMPTE o il numero di traccia assoluto. A tale scopo, chiamare il metodo IAMTimecodeReader::GetTimecode . Questo metodo accetta un puntatore a una struttura TIMECODE_SAMPLE , che descrive il codice temporale. Prima di chiamare il metodo, inizializzare il membro dwFlags della struttura. Usare il valore ED_DEVCAP_TIMECODE_READ per recuperare il codice di tempo o il valore ED_DEVCAP_ATN_READ per recuperare il numero di traccia assoluto.

Il membro timecode della struttura TIMECODE_SAMPLE è una struttura TIMECODE. Quando il metodo restituisce, il membro dwFrames della struttura TIMECODE contiene il codice temporale o il numero di traccia. Per il timecode, le ore, i minuti, i secondi e i fotogrammi vengono inseriti in una DWORD come valori decimali codificati binari (BCD), con il formato hhmmssff. Usare i maschera bit per estrarre i singoli valori.

Nell'esempio seguente viene recuperato il codice temporale e il numero di traccia.

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;
    }
}

Controllo di una videocamera DV