Produzindo dados em um filtro de captura
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na 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 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.
Filtrar alterações de estado
Um filtro de captura deve produzir dados somente quando o filtro estiver em execução. Não envie dados de seus pinos quando o filtro for pausado. Além disso, retorne VFW_S_CANT_CUE do método CBaseFilter::GetState quando o filtro for pausado. Esse valor retornado informa ao Gerenciador do Grafo de Filtro que ele não deve aguardar nenhum dado do filtro enquanto o filtro estiver em pausa. Para obter mais informações, consulte Estados de filtro.
O código a seguir mostra como implementar o método IMediaFilter::GetState :
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 dar suporte à interface IAMStreamControl , para que um aplicativo possa ativar ou desativar cada pino individualmente. Por exemplo, um aplicativo pode visualizar sem capturar e alternar para o modo de captura sem recompilar o grafo de filtro. Você pode usar a classe CBaseStreamControl para implementar essa interface.
Carimbos de Data/Hora
Quando o filtro captura um exemplo, carimbo de data/hora do exemplo com o tempo de fluxo atual. A hora de término é a hora de início mais a duração. Por exemplo, se o filtro estiver capturando em dez exemplos por segundo e o tempo de fluxo for de 200.000.000 unidades quando o filtro capturar o exemplo, os carimbos de data/hora deverão ser 200000000 e 2010000000. (Há 10.000.000 unidades por segundo.)
Para calcular o tempo de fluxo, chame o método IReferenceClock::GetTime para obter a hora de referência atual e substrate a hora de início original. Como alternativa, chame o método CBaseFilter::StreamTime , 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, os exemplos do pino de visualização não deverão ter carimbos de data/hora. O motivo é que os exemplos sempre alcançarão o renderizador ligeiramente após o tempo de captura. Se os exemplos tiverem carimbo de data/hora, o renderizador os tratará como atrasados e poderá tentar alcançá-los soltando amostras. (Para obter mais informações, consulte Filtros de captura de vídeo do DirectShow.) Observe que a interface IAMStreamControl requer o pino para acompanhar os horários de exemplo. Para um pin 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 sempre devem aumentar de um exemplo para o outro. Isso é verdadeiro mesmo quando o filtro é pausado. Se o filtro for executado, pausado e executado novamente, o primeiro exemplo após a pausa deverá ter um carimbo de data/hora maior do que o último exemplo antes da pausa.
Dependendo dos dados que você está capturando, pode ser apropriado definir o tempo de mídia nos exemplos.
Para obter mais informações, consulte Hora e relógios no DirectShow.
Tópicos relacionados