Manipulando eventos repintar na captura de vídeo

[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.]

Se você criar um grafo de captura de vídeo sem usar a interface ICaptureGraphBuilder2 e visualizar o vídeo usando o filtro antigo do Renderizador de Vídeo, deverá substituir o tratamento padrão para eventos EC_REPAINT . Consulte o Gerenciador de Grafo de Filtro para a interface IMediaEvent e chame o método IMediaEvent::CancelDefaultHandling com o valor EC_REPAINT:

IMediaEvent *pEvent = 0;
hr = pGraph->QueryInterface(IID_IMediaEvent, (void**)&pEvent);
if (SUCCEEDED(hr))
{
    pEvent->CancelDefaultHandling (EC_REPAINT);
    pEvent->Release();
}

Isso impede um possível erro que pode corromper o arquivo de captura. Se o usuário cobrir e descobrir a janela de visualização, o filtro renderizador de vídeo receberá uma mensagem WM_PAINT. Por padrão, o Renderizador de Vídeo solicita um novo quadro e o Gerenciador de Grafo de Filtro pausa o grafo para sinalizar outro quadro de vídeo. Se isso acontecer enquanto o grafo estiver gravando um arquivo, ele corromperá o arquivo. Substituir o comportamento de EC_REPAINT padrão impede que o renderizador solicite um novo quadro.

Você não precisará executar esta etapa se estiver usando a interface ICaptureGraphBuilder2 , pois o Capture Graph Builder faz isso automaticamente para você. Além disso, não será necessário se você estiver usando o VMR (Renderizador de Combinação de Vídeo) para visualização. A VMR sempre tem o quadro mais recente disponível, portanto, não envia eventos EC_REPAINT.

Tópicos avançados de captura

Notificação de evento no DirectShow