Obtendo o código de tempo do dispositivo
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Enquanto uma fita DV está sendo reproduzida ou está no modo de pausa de registro, você pode recuperar o código de tempo SMPTE ou o número de faixa absoluto. Para fazer isso, chame o método IAMTimecodeReader::GetTimecode . Esse método usa um ponteiro para uma estrutura TIMECODE_SAMPLE , que descreve o código de tempo. Antes de chamar o método , inicialize o membro dwFlags da estrutura . Use o valor ED_DEVCAP_TIMECODE_READ para recuperar o código de tempo ou o valor ED_DEVCAP_ATN_READ para recuperar o número de faixa absoluto.
O membro timecode da estrutura TIMECODE_SAMPLE é uma estrutura TIMECODE. Quando o método retorna, o membro dwFrames da estrutura TIMECODE contém o código de tempo ou o número de faixa. Para o código de tempo, as horas, os minutos, os segundos e os quadros são empacotados em um DWORD como valores decimal codificados binários (BCD), com o formato hhmmssff. Use bitmasks para extrair os valores individuais.
O exemplo a seguir recupera o código de tempo e o número da faixa.
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;
}
}
Tópicos relacionados