Compartir a través de


Obtención del código de tiempo del dispositivo

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Mientras se reproduce una cinta DV o está en modo de pausa de grabación, puede recuperar el código de tiempo SMPTE o el número de pista absoluto. Para ello, llame al método IAMTimecodeReader::GetTimecode . Este método toma un puntero a una estructura TIMECODE_SAMPLE , que describe el código de tiempo. Antes de llamar al método , inicialice el miembro dwFlags de la estructura. Use el valor ED_DEVCAP_TIMECODE_READ para recuperar el código de tiempo o el valor ED_DEVCAP_ATN_READ para recuperar el número de pista absoluto.

El miembro timecode de la estructura TIMECODE_SAMPLE es una estructura TIMECODE. Cuando se devuelve el método, el miembro dwFrames de la estructura TIMECODE contiene el código de tiempo o el número de seguimiento. En el caso del código de tiempo, las horas, los minutos, los segundos y los fotogramas se empaquetan en un DWORD como valores decimales codificados binarios (BCD), con el formato hhmmssff. Use máscaras de bits para extraer los valores individuales.

En el ejemplo siguiente se recupera el código de tiempo y el número de seguimiento.

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

Control de una videocámara DV