Obtendo o código de tempo do dispositivo

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Enquanto uma fita DV está sendo reproduzida ou está no modo de pausa de registro, você pode recuperar o código de tempo SMPTE ou o número de faixa absoluto. Para fazer isso, chame o método IAMTimecodeReader::GetTimecode . Esse método usa um ponteiro para uma estrutura TIMECODE_SAMPLE , que descreve o código de tempo. Antes de chamar o método , inicialize o membro dwFlags da estrutura . Use o valor ED_DEVCAP_TIMECODE_READ para recuperar o código de tempo ou o valor ED_DEVCAP_ATN_READ para recuperar o número de faixa absoluto.

O membro timecode da estrutura TIMECODE_SAMPLE é uma estrutura TIMECODE. Quando o método retorna, o membro dwFrames da estrutura TIMECODE contém o código de tempo ou o número de faixa. Para o código de tempo, as horas, os minutos, os segundos e os quadros são empacotados em um DWORD como valores decimal codificados binários (BCD), com o formato hhmmssff. Use bitmasks para extrair os valores individuais.

O exemplo a seguir recupera o código de tempo e o número da faixa.

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

Controlando uma câmera DV