Conectar dois filtros
[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.]
Este tópico mostra algumas funções auxiliares para conectar filtros do DirectShow.
Para conectar dois filtros, você deve encontrar um pino de saída não conectado no filtro upstream e um pino de entrada não conectado no filtro downstream.
Se você já tiver ponteiros para ambos os pinos, chame o método IGraphBuilder::Connect para conectá-los. Se os pinos não puderem se conectar diretamente uns aos outros, o método IGraphBuilder::Connect poderá inserir filtros adicionais para concluir a conexão. Para obter mais informações, consulte Conexão inteligente.
Se você tiver um ponteiro para os filtros, mas não os pinos, deverá usar o método IBaseFilter::EnumPins para localizar os pinos. (Consulte Enumerando pinos.) As funções auxiliares neste tópico demonstram essa técnica.
Pino de saída para filtrar
A função a seguir usa dois parâmetros: um ponteiro para um pino de saída e um ponteiro para um filtro. A função conecta o pino de saída ao primeiro pino de entrada disponível no filtro.
// Connect output pin to filter.
HRESULT ConnectFilters(
IGraphBuilder *pGraph, // Filter Graph Manager.
IPin *pOut, // Output pin on the upstream filter.
IBaseFilter *pDest) // Downstream filter.
{
IPin *pIn = NULL;
// Find an input pin on the downstream filter.
HRESULT hr = FindUnconnectedPin(pDest, PINDIR_INPUT, &pIn);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
}
return hr;
}
Essa função faz o seguinte:
- Chama a
FindUnconnectedPin
função para obter um pino de entrada não conectado. Essa função é mostrada no tópico Localizar um Pino Não Conectado em um Filtro. - Chama IGraphBuilder::Connect para conectar os dois pinos.
Filtrar para o Pin de Entrada
A próxima função usa um ponteiro para um filtro e um ponteiro para um pino de entrada. Ele conecta o pino de entrada ao primeiro pino de saída disponível no filtro.
// Connect filter to input pin.
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IPin *pIn)
{
IPin *pOut = NULL;
// Find an output pin on the upstream filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
// Try to connect them.
hr = pGraph->Connect(pOut, pIn);
pOut->Release();
}
return hr;
}
Filtrar para Filtrar
A terceira função usa um ponteiro para um filtro upstream e um ponteiro para um filtro downstream e tenta conectar ambos os filtros.
// Connect filter to filter
HRESULT ConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pSrc, IBaseFilter *pDest)
{
IPin *pOut = NULL;
// Find an output pin on the first filter.
HRESULT hr = FindUnconnectedPin(pSrc, PINDIR_OUTPUT, &pOut);
if (SUCCEEDED(hr))
{
hr = ConnectFilters(pGraph, pOut, pDest);
pOut->Release();
}
return hr;
}
Tópicos relacionados