Поделиться через


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

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

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

Элемент timecode структуры 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 camcorder