디바이스에서 시간 코드 가져오기

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

DV 테이프가 재생 중이거나 레코드 일시 중지 모드에 있는 동안 SMPTE 시간 코드 또는 절대 트랙 번호를 검색할 수 있습니다. 이렇게 하려면 IAMTimecodeReader::GetTimecode 메서드를 호출합니다. 이 메서드는 시간 코드를 설명하는 TIMECODE_SAMPLE 구조체에 대한 포인터를 사용합니다. 메서드를 호출하기 전에 구조체의 dwFlags 멤버를 초기화합니다. ED_DEVCAP_TIMECODE_READ 값을 사용하여 절대 트랙 번호를 검색하기 위해 시간 코드 또는 ED_DEVCAP_ATN_READ 값을 검색합니다.

TIMECODE_SAMPLE 구조체의 timecode 멤버는 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;
    }
}

DV 캠코더 제어