Получение кода времени с устройства

[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи захват аудио и видео в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и Audio/Video Capture в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]

Хотя лента DV воспроизводится или находится в режиме приостановки записи, вы можете получить SMPTE код времени или абсолютный номер трека. Для этого вызовите метод IAMTimecodeReader::GetTimecode. Этот метод принимает указатель на структуру TIMECODE_SAMPLE, которая описывает код времени. Перед вызовом метода инициализировать dwFlags член структуры. Используйте значение ED_DEVCAP_TIMECODE_READ для получения кода времени или значение ED_DEVCAP_ATN_READ для получения абсолютного номера дорожки.

Элемент кода времени структуры TIMECODE_SAMPLE является структурой TIMECODE. При возврате метода элемент dwFrames структуры TIMECODE содержит код времени или номер дорожки. Для кода времени часы, минуты, секунды и кадры упаковываются в DWORD в виде двоичных закодированных десятичных значений (BCD) с форматом hhmmssff. Используйте битовые маски для извлечения отдельных значений.

В следующем примере извлекается код времени и номер отслеживания.

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

Управление видеокамерой DV