Получение кода времени с устройства
[Функция, связанная с этой страницей 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;
}
}
Связанные темы