Produzindo dados em um filtro de captura
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no 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.]
Este tópico descreve como um filtro de captura DirectShow personalizado deve gerar dados de saída.
Alterações de estado do filtro
Um filtro de captura deve produzir dados somente quando o filtro estiver em execução. Não envie dados dos seus pinos quando o filtro estiver pausado. Além disso, quando o filtro estiver pausado, retorne VFW_S_CANT_CUE do método CBaseFilter::GetState. Esse valor de retorno informa ao Gerenciador de Gráficos de Filtro que ele não deve esperar por nenhum dado do seu filtro enquanto o filtro estiver pausado. Para obter mais informações, consulte Estados de filtro.
O código a seguir mostra como implementar o IMediaFilter::GetState método:
CMyVidcapFilter::GetState(DWORD dw, FILTER_STATE *pState)
{
CheckPointer(pState, E_POINTER);
*pState = m_State;
if (m_State == State_Paused)
{
return VFW_S_CANT_CUE;
}
else
{
return S_OK;
}
}
Controlando fluxos individuais
Os pinos de saída de um filtro de captura devem suportar o interface IAMStreamControl, para que um aplicativo possa ligar ou desligar cada pino individualmente. Por exemplo, um aplicativo pode visualizar sem capturar e, em seguida, alternar para o modo de captura sem reconstruir o gráfico de filtro. Você pode usar a classeCBaseStreamControl para implementar essa interface.
Carimbos temporais
Quando o filtro capturar uma amostra, carimbe a hora da amostra com a hora do fluxo atual. A hora de fim é a hora de início mais a duração. Por exemplo, se o filtro estiver a capturar a dez amostras por segundo e o tempo de fluxo for de 200.000.000 unidades quando o filtro capturar a amostra, os carimbos temporais deverão ser 200000000 e 201000000. (Há 10.000.000 de unidades por segundo.)
Para calcular o tempo de fluxo, chame o método IReferenceClock::GetTime para obter a hora de referência atual e, em seguida, subtraia a hora de início original. Como alternativa, chame o CBaseFilter::StreamTime método, que executa o mesmo cálculo. Para definir o carimbo de data/hora em um exemplo, chame o método IMediaSample::SetTime.
No entanto, se o filtro tiver um pino de visualização, as amostras do pino de visualização não deverão ter carimbos de data/hora. O motivo é que as amostras sempre chegarão ao renderizador um pouco após o momento da captura. Se as amostras tiverem carimbo temporal, o renderizador irá tratá-las como tardias e pode tentar recuperar o atraso descartando amostras. (Para obter mais informações, consulte Filtros de captura de vídeo DirectShow.) Observe que a interface IAMStreamControl requer o conetor para acompanhar os tempos de amostragem. Para um pino de visualização, talvez seja necessário modificar a implementação para que ela não dependa de carimbos de data/hora.
Os carimbos de data/hora devem sempre aumentar de uma amostra para outra. Isso é verdade mesmo quando o filtro pausa. Se o filtro for executado, pausado e executado novamente, a primeira amostra após a pausa deverá ter um carimbo de data/hora maior do que a última amostra antes da pausa.
Dependendo dos dados que você está capturando, pode ser apropriado definir o tempo de mídia nas amostras.
Para obter mais informações, consulte Tempo e Relógios no DirectShow.
Tópicos relacionados