共用方式為


從裝置取得 Timecode

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

當 DV 磁帶現正播放或處於錄製暫停模式時,您可以擷取 SMPTE 時間碼或絕對曲目號碼。 若要這樣做,請呼叫 IAMTimecodeReader::GetTimecode 方法。 這個方法會採用描述 timecode 之TIMECODE_SAMPLE 結構的指標。 呼叫 方法之前,請先初始化 結構的 dwFlags 成員。 使用值ED_DEVCAP_TIMECODE_READ來擷取 timecode 或值ED_DEVCAP_ATN_READ擷取絕對追蹤編號。

TIMECODE_SAMPLE結構的timecode成員是 TIMECODE 結構。 當方法傳回時,TIMECODE 結構的 dwFrames 成員會包含 timecode 或追蹤編號。 對於 timecode,時數、分鐘、秒和框架會封裝成 DWORD 作為二進位編碼十進位 (BCD) 值,格式為 hhmmssff。 使用位元遮罩來擷取個別值。

下列範例會擷取 timecode 和 track number。

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