从设备获取时间代码

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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;
    }
}

控制 DV 摄像机