Compartilhar via


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.

Filtros de Captura de Vídeo do DirectShow

Hora e relógios no DirectShow

Escrevendo filtros de captura