Combinando captura de vídeo e visualização
[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.]
As seções anteriores descrevem como capturar vídeos em vários formatos de arquivo. A seção Visualizando Vídeo descreve como criar um grafo de visualização ao vivo. No entanto, muitos aplicativos devem fazer ambos de uma só vez. Para criar uma visualização combinada e um grafo de gravação de arquivo, basta fazer duas chamadas para ICaptureGraphBuilder2::RenderStream:
// Render the preview stream to the video renderer.
hr = pBuild->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, pCap,
NULL, NULL);
// Render the capture stream to the mux.
hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, pCap,
NULL, pMux);
Neste código, o Capture Graph Builder está ocultando alguns detalhes:
Se o filtro de captura tiver um pin de visualização ou um pino de porta de vídeo, além de um pino de captura, o método RenderStream simplesmente renderizará ambos os pinos, conforme mostrado na ilustração a seguir.
Se o filtro tiver apenas um pin de captura, o Capture Graph Builder usará o filtro Smart Tee para dividir o fluxo de captura. A ilustração a seguir mostra o grafo com um Tee Inteligente.
O filtro Do Smart Tee tem um pin de captura e um pin de visualização. Ele usa um único fluxo de vídeo do filtro de captura e o divide em dois fluxos, um para captura e outro para visualização. Para manter a taxa de transferência no pino de captura, o pino de visualização descarta os quadros conforme necessário. Ele também tira os carimbos de data/hora de cada exemplo antes de entregá-lo, pelos motivos discutidos no tópico Filtros de Captura de Vídeo do DirectShow.
Embora o Smart Tee divida o fluxo, ele não duplica fisicamente os dados de vídeo. Em vez disso, ele usa objetos de exemplo de mídia personalizados que compartilham os buffers. Os exemplos são marcados como "somente leitura" para garantir que os filtros downstream não sejam gravados nos dados.
Se o grafo de captura tiver uma janela de visualização, várias coisas poderão fazer com que o Gerenciador de Grafo de Filtro interrompa todo o grafo, incluindo o fluxo de captura:
- Bloqueando o computador.
- Pressionando CTRL+ALT+DELETE em um computador que é membro de um domínio.
- Executando um aplicativo Direct3D em tela inteira, como um jogo ou um protetor de tela.
- Alternar monitores ou alterar a resolução de exibição.
- Executando um programa que faz com que o Windows exiba uma caixa de diálogo UAC (Controle de Conta de Usuário). (Windows Vista ou posterior.)
- Executando uma janela DOS de tela inteira.
Qualquer um desses eventos pode interromper a sessão de captura, possivelmente causando perda de dados. (Veja o que acontece internamente: o renderizador de vídeo perde os recursos direct3D ou DirectDraw de que precisa. No processo de recuperação desses recursos, o renderizador de vídeo deve se reconectar com o filtro upstream, fazendo com que o Gerenciador de Grafo de Filtro interrompa o grafo.)
Duas soluções possíveis para esse problema são as seguintes:
- Não inclua um fluxo de visualização. No entanto, lembre-se de que o método ICaptureGraphBuilder2::RenderStream adiciona automaticamente uma janela de visualização quando o dispositivo de captura tem um pin de porta de vídeo. Consulte Pinos de porta de vídeo na Captura de Arquivo.
- Use o Mecanismo de Buffer de Fluxo para enviar o fluxo de visualização para um grafo em outro processo.
Tópicos relacionados