Filtros de Captura de Vídeo do DirectShow

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

Os filtros de captura no DirectShow têm alguns recursos que os distinguem de outros tipos de filtros. Embora o Capture Graph Builder oculte muitos dos detalhes, é uma boa ideia ler esta seção para ter uma compreensão geral dos grafos de captura do DirectShow.

Fixar Categorias

Um filtro de captura geralmente tem dois ou mais pinos de saída que fornecem o mesmo tipo de dados, por exemplo, um pin de visualização e um pino de captura. Portanto, os tipos de mídia não são uma boa maneira de distinguir os pinos. Em vez disso, os pinos são diferenciados por sua funcionalidade, que é identificada usando um GUID, chamada categoria de pino.

Para obter uma discussão sobre como consultar pinos para sua categoria, consulte Trabalhando com categorias de pino. No entanto, para a maioria dos aplicativos, você não precisará consultar os pinos diretamente. Em vez disso, vários métodos ICaptureGraphBuilder2 assumem parâmetros que especificam a categoria de pino na qual operar. O Capture Graph Builder localiza automaticamente o pino correto.

Visualizar pinos e capturar pinos

Alguns dispositivos de captura de vídeo têm pinos de saída separados para visualização e captura. O pino de visualização é usado para renderizar o vídeo na tela, enquanto o pino de captura é usado para gravar vídeo em um arquivo.

Um pin de visualização e um pin de captura têm as seguintes diferenças:

  • Um pino de visualização remove quadros conforme necessário para manter a taxa de transferência no pino de captura.
  • Cada quadro de um pin de captura é carimbado com o tempo de fluxo quando o quadro foi capturado. Um pino de visualização não marca o carimbo de data/hora dos exemplos que ele fornece.

O motivo pelo qual os quadros de visualização não têm carimbos de data/hora é que o grafo de filtro introduz uma pequena quantidade de latência no fluxo. Se o tempo de captura for usado como a hora da apresentação, o renderizador de vídeo tratará cada amostra como um pouco atrasada. Isso pode fazer com que o renderizador de vídeo solte quadros enquanto tenta recuperar o atraso. A remoção dos carimbos de data/hora garante que o renderizador apresente cada amostra quando chegar, sem descartar quadros.

A categoria de pino para pinos de visualização é PIN_CATEGORY_PREVIEW. A categoria para pinos de captura é PIN_CATEGORY_CAPTURE.

Pinos de porta de vídeo

Uma porta de vídeo é uma conexão de hardware entre um dispositivo de vídeo (como um sintonizador de TV analógico) e o vídeo cartão. Uma porta de vídeo permite que o dispositivo envie dados de vídeo diretamente para os elementos gráficos cartão. O vídeo é exibido na tela usando uma sobreposição de hardware. Uma porta de vídeo pode ser um cabo real que conecta dois dispositivos em cartões separados; ou pode ser uma conexão com fio no mesmo cartão.

A vantagem de uma porta de vídeo é que o vídeo entra diretamente na memória do vídeo, sem nenhum trabalho da CPU. No entanto, as portas de vídeo têm algumas desvantagens:

  • Uma porta de vídeo sempre usa a superfície de sobreposição durante a captura, independentemente de você querer visualizar o vídeo.
  • A inversão entre quadros ocorre automaticamente, o que dificulta a sincronização da inversão com outras operações de vídeo.

Se um dispositivo de captura usar uma porta de vídeo, o filtro de captura terá um pin de porta de vídeo em vez de um pin de visualização. A categoria de pino para pinos de porta de vídeo é PIN_CATEGORY_VIDEOPORT.

Cada filtro de captura tem pelo menos um pino de captura. Além disso, ele pode ter um pin de visualização ou um pino de porta de vídeo, mas nunca ambos. Os filtros podem ter vários pinos de captura e pinos de visualização, cada um fornecendo um tipo de mídia separado. Assim, um único filtro pode ter um pin de captura de vídeo, um pin de visualização de vídeo, um pin de captura de áudio e um pin de visualização de áudio. (No entanto, não há nada equivalente a uma porta de vídeo para áudio.)

Filtros WDM upstream

Os dispositivos WDM (Modelo de Driver do Windows) podem exigir alguns filtros adicionais upstream do filtro de captura. Esses filtros incluem o seguinte:

Embora sejam filtros separados no DirectShow, eles normalmente representam o mesmo dispositivo de hardware. Cada filtro controla uma função diferente do dispositivo. Os filtros são conectados por pinos, mas nenhum dado de mídia se move entre as conexões de pino. Portanto, os pinos nesses filtros não se conectam estabelecendo um tipo de mídia. Em vez disso, eles usam valores GUID chamados médias. GuiDs médios são definidos exclusivamente para um determinado minidriver de dispositivo. Por exemplo, o filtro sintonizador de TV e o filtro captura de vídeo para o mesmo cartão de TV darão suporte ao mesmo meio, o que permite que o aplicativo crie o grafo corretamente.

Na prática, enquanto você estiver usando ICaptureGraphBuilder2 para criar grafos de captura, esses filtros serão adicionados ao grafo automaticamente. Para obter uma discussão mais detalhada, consulte Filtros de driver de classe WDM.

Sobre a Captura de Vídeo no DirectShow