Соединение двух фильтров
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]
В этом разделе показаны некоторые вспомогательные функции для подключения фильтров DirectShow.
Чтобы подключить два фильтра, необходимо найти несоединенные выходные контакты в фильтре вышестоящий и несоединенные входные контакты в нисходящем фильтре.
Если у вас уже есть указатели на оба контакта, вызовите метод IGraphBuilder::Connect , чтобы подключить их. Если контакты не могут подключаться друг к другу напрямую, метод IGraphBuilder::Connect может вставить дополнительные фильтры для завершения соединения. Дополнительные сведения см. в разделе Intelligent Connect.
Если у вас есть указатель на фильтры, но не контакты, для поиска контактов необходимо использовать метод IBaseFilter::EnumPins . (См. раздел Перечисление контактов.) Вспомогательные функции в этом разделе демонстрируют этот метод.
Вывод закрепления к фильтру
Следующая функция принимает два параметра: указатель на выходной контакт и указатель на фильтр. Функция подключает выходной контакт к первому доступному входному контакту на фильтре.
// 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;
}
Эта функция выполняет следующие действия:
- Вызывает функцию
FindUnconnectedPin
для получения несоединенного контактного ввода. Эта функция показана в разделе Поиск несоединенного контакта на фильтре. - Вызывает IGraphBuilder::Connect для подключения двух контактов.
Фильтрация по вводу пин-кода
Следующая функция принимает указатель на фильтр и указатель на входной контакт. Он подключает входной контакт к первому доступному выходному контакту на фильтре.
// 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;
}
Фильтрация для фильтрации
Третья функция принимает указатель на фильтр вышестоящий и указатель на подчиненный фильтр и пытается подключить оба фильтра.
// 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;
}
Связанные темы