디바이스에서 시간 코드 가져오기
[DirectShow 이 페이지와 연결된 기능은 레거시 기능입니다. MediaPlayer, IMFMediaEngine, Media Foundation 오디오/비디오 캡처대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11에 최적화되었습니다. Microsoft는 가능하면 새로운 코드에서 MediaPlayer, IMFMediaEngine 및 Audio/Video Capture를 DirectShow대신 Media Foundation 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
DV 테이프가 재생 중이거나 레코드 일시 중지 모드인 동안 SMPTE 시간 코드 또는 절대 트랙 번호를 검색할 수 있습니다. 이렇게 하려면 IAMTimecodeReader::GetTimecode 메서드를 호출합니다. 이 메서드는 시간 코드를 설명하는 TIMECODE_SAMPLE 구조체에 대한 포인터를 사용합니다. 메서드를 호출하기 전에 구조체의 dwFlags 멤버를 초기화합니다. ED_DEVCAP_TIMECODE_READ 값을 사용하여 타임코드를 검색하거나 ED_DEVCAP_ATN_READ 값을 사용하여 절대 트랙 번호를 검색합니다.
TIMECODE_SAMPLE 구조체의 시간 코드 멤버는 TIMECODE 구조체입니다. 메서드가 반환되면 TIMECODE 구조의 dwFrames 멤버에 시간 코드 또는 트랙 번호가 포함됩니다. 시간 코드의 경우 시간, 분, 초 및 프레임은 Hhmmssff 형식으로 BCD(이진 코딩된 10진수) 값으로 DWORD로 압축됩니다. 비트 마스크를 사용하여 개별 값을 추출합니다.
다음 예제에서는 시간 코드 및 트랙 번호를 검색합니다.
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;
}
}
관련 항목