从设备获取时间代码
[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayer、 IMFMediaEngine 和 媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
当 DV 磁带正在播放或处于录制暂停模式时,可以检索 SMPTE 时间代码或绝对曲目编号。 为此,请调用 IAMTimecodeReader::GetTimecode 方法。 此方法采用指向描述时间代码 的TIMECODE_SAMPLE 结构的指针。 在调用 方法之前,请初始化 结构的 dwFlags 成员。 使用值ED_DEVCAP_TIMECODE_READ检索时间代码,或使用值ED_DEVCAP_ATN_READ检索绝对跟踪数。
TIMECODE_SAMPLE结构的 timecode 成员是 TIMECODE 结构。 当方法返回时,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;
}
}
相关主题