Abrufen des Timecodes vom Gerät

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

Während ein DV-Band wiedergegeben wird oder sich im Aufzeichnungs-Pause-Modus befindet, können Sie den SMPTE-Timecode oder die absolute Tracknummer abrufen. Rufen Sie hierzu die IAMTimecodeReader::GetTimecode-Methode auf. Diese Methode verwendet einen Zeiger auf eine TIMECODE_SAMPLE-Struktur , die den Timecode beschreibt. Initialisieren Sie vor dem Aufrufen der -Methode den dwFlags-Member der -Struktur. Verwenden Sie den Wert ED_DEVCAP_TIMECODE_READ, um den Timecode oder den Wert ED_DEVCAP_ATN_READ abzurufen, um die absolute Spurnummer abzurufen.

Das Timecodeelement der TIMECODE_SAMPLE-Struktur ist eine TIMECODE-Struktur. Wenn die Methode zurückgibt, enthält das dwFrames-Element der TIMECODE-Struktur den Timecode oder die Tracknummer. Für Timecode werden die Stunden, Minuten, Sekunden und Frames als binär codierte Dezimalwerte (BCD) mit dem Format hhmmssff in ein DWORD gepackt. Verwenden Sie Bitmasken, um die einzelnen Werte zu extrahieren.

Im folgenden Beispiel werden der Timecode und die Nachverfolgungsnummer abgerufen.

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

Steuern eines DV-Camcorders