Introdução ao desenvolvimento de filtros do DirectShow
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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.]
Esta seção fornece uma breve estrutura de tópicos das tarefas envolvidas no desenvolvimento de um filtro DirectShow personalizado. Ele também fornece links para tópicos que discutem essas tarefas com mais detalhes. Antes de ler esta seção, leia os tópicos em Sobre o DirectShow, que descrevem a arquitetura geral do DirectShow.
Biblioteca de Classes Base do DirectShow
O SDK do DirectShow inclui um conjunto de classes C++ para escrever filtros. Embora não sejam necessárias, essas classes são a maneira recomendada de escrever um novo filtro. Para usar as classes base, compile-as em uma biblioteca estática e vincule o arquivo .lib ao seu projeto, conforme descrito em Criando Filtros do DirectShow.
A biblioteca de classes base define uma classe raiz para filtros, a classe CBaseFilter . Várias outras classes derivam de CBaseFilter e são especializadas para tipos específicos de filtros. Por exemplo, a classe CTransformFilter foi projetada para transformar filtros. Para criar um novo filtro, implemente uma classe que herda de uma das classes de filtro. Por exemplo, sua declaração de classe pode ser a seguinte:
class CMyFilter : public CTransformFilter
{
private:
/* Declare variables and methods that are specific to your filter.
public:
/* Override various methods in CTransformFilter */
};
Para obter mais informações sobre as classes base do DirectShow, consulte os seguintes tópicos:
Criando pinos
Um filtro deve criar um ou mais pinos. O número de pinos pode ser corrigido em tempo de design ou o filtro pode criar novos pinos conforme necessário. Os pinos geralmente derivam da classe CBasePin ou de uma classe que herda CBasePin, como CBaseInputPin. Os pinos do filtro devem ser declarados como variáveis de membro na classe de filtro. Algumas das classes de filtro já definem os pinos, mas se o filtro herda diretamente de CBaseFilter, você deve declarar os pinos em sua classe derivada.
Negociando conexões de pino
Quando o Gerenciador de Grafo de Filtro tenta conectar dois filtros, os pinos devem concordar com várias coisas. Se não puderem, a tentativa de conexão falhará. Em geral, os pinos negociam o seguinte:
- Transport: O transporte é o mecanismo que os filtros usarão para mover amostras de mídia do pino de saída para o pino de entrada. Por exemplo, eles podem usar a interface IMemInputPin ("modelo de push") ou a interface IAsyncReader ("modelo de pull").
- Tipo de mídia. Quase todos os pinos usam tipos de mídia para descrever o formato dos dados que eles fornecerão.
- Alocador. O alocador é o objeto que cria os buffers que contêm os dados. Os pinos devem concordar com qual pino fornecerá o alocador. Eles também devem concordar com o tamanho dos buffers, o número de buffers a serem criados e outras propriedades de buffer.
As classes base implementam uma estrutura para essas negociações. Você deve concluir os detalhes substituindo vários métodos na classe base. O conjunto de métodos que você deve substituir depende da classe e da funcionalidade do filtro. Para obter mais informações, consulte How Filters Connect.
Processando e entregando dados
A função principal da maioria dos filtros é processar e fornecer dados de mídia. Como isso ocorre depende do tipo de filtro:
- Uma fonte de push tem um thread de trabalho que preenche continuamente amostras com dados e os fornece downstream.
- Uma fonte de pull aguarda que seu vizinho downstream solicite um exemplo. Ele responde gravando dados em um exemplo e fornecendo o exemplo para o filtro downstream. O filtro downstream cria o thread que impulsiona o fluxo de dados.
- Um filtro de transformação tem exemplos entregues a ele por seu vizinho upstream. Quando recebe um exemplo, ele processa os dados e os entrega downstream.
- Um filtro de renderizador recebe amostras de upstream e os agenda para renderização com base nos carimbos de data/hora.
Outras tarefas relacionadas ao streaming incluem liberar dados do grafo, lidar com o final do fluxo e responder a solicitações de busca. Para obter mais informações sobre esses problemas, consulte os seguintes tópicos:
- Fluxo de Dados para desenvolvedores de filtro
- Gerenciamento de controle de qualidade
- Threads e seções críticas
Suporte ao COM
Os filtros DirectShow são objetos COM, normalmente empacotados em DLLs. A biblioteca de classes base implementa uma estrutura para dar suporte ao COM. Ele é descrito na seção DirectShow e COM.
Tópicos relacionados