Bagikan melalui


Mendapatkan Kode Waktu dari Perangkat

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine dan Audio/Video Capture di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Saat pita DV diputar atau dalam mode jeda rekaman, Anda dapat mengambil kode waktu SMPTE atau nomor trek absolut. Untuk melakukan ini, panggil metode IAMTimecodeReader::GetTimecode . Metode ini mengambil pointer ke struktur TIMECODE_SAMPLE , yang menjelaskan kode waktu. Sebelum memanggil metode , inisialisasi anggota struktur dwFlags . Gunakan nilai ED_DEVCAP_TIMECODE_READ untuk mengambil kode waktu atau nilai ED_DEVCAP_ATN_READ untuk mengambil nomor trek absolut.

Anggota kode waktu dari struktur TIMECODE_SAMPLE adalah struktur TIMECODE. Ketika metode kembali, anggota dwFrames dari struktur TIMECODE berisi kode waktu atau nomor trek. Untuk kode waktu, jam, menit, detik, dan bingkai dikemas ke dalam DWORD sebagai nilai desimal berkode biner (BCD), dengan format hhmmssff. Gunakan bitmasks untuk mengekstrak nilai individual.

Contoh berikut mengambil kode waktu dan melacak nomor.

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;
    }
}

Mengontrol DV Camcorder