Udostępnij przez


Pobieranie kodu czasu z urządzenia

[Funkcja skojarzona z tą stroną, DirectShow, jest starszą funkcją. Został zastąpiony przez MediaPlayer, IMFMediaEnginei Audio/Video Capture w Media Foundation. Te funkcje zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał MediaPlayer, IMFMediaEngine i Audio/Video Capture w programie Media Foundation zamiast DirectShow, jeśli to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Gdy taśma DV jest odtwarzana lub jest w trybie wstrzymania nagrywania, można pobrać kod czasu SMPTE lub bezwzględny numer ścieżki. W tym celu wywołaj metodę IAMTimecodeReader::GetTimecode. Ta metoda przyjmuje wskaźnik do struktury TIMECODE_SAMPLE, która opisuje kod czasu. Przed wywołaniem metody zainicjuj element dwFlags w strukturze. Użyj wartości ED_DEVCAP_TIMECODE_READ, aby pobrać kod czasu lub wartość ED_DEVCAP_ATN_READ, aby pobrać bezwzględną liczbę ścieżki.

Członek kodu czasu struktury TIMECODE_SAMPLE jest strukturą TIMECODE. Gdy metoda zwraca, dwFrames w składowej struktury TIMECODE zawiera kod czasu lub numer ścieżki. W przypadku kodu czasu godziny, minuty, sekundy i ramki są pakowane do DWORD jako wartości binarne zakodowane dziesiętnie (BCD), z formatem hhmmssff. Użyj mask bitowych, aby wyodrębnić poszczególne wartości.

Poniższy przykład pobiera kod czasu i numer ścieżki.

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

Sterowanie kamerą DV