從裝置取得 Timecode
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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;
}
}
相關主題