Общие сведения о построении Графа
[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует, чтобы новый код использовал MediaPlayer, IMFMediaEngine и аудио- и видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, использующий устаревшие API, чтобы по возможности использовать новые API.]
Чтобы создать граф фильтра, начните с создания экземпляра диспетчера графов фильтров:
IGraphBuilder* pIGB;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
(void **)&pIGB);
Диспетчер графов фильтров поддерживает следующие методы построения графов:
- IFilterGraph::ConnectDirect пытается установить прямое соединение между двумя контактами. Если контакты не могут подключиться, метод завершается ошибкой.
- IGraphBuilder::Connect соединяет два контакта. Если это возможно, он устанавливает прямое соединение. В противном случае для завершения подключения используются промежуточные фильтры.
- IGraphBuilder::Render начинается с выходного закрепления и создает остальную часть графа. Этот метод добавляет фильтры по мере необходимости, работая ниже, пока не достигнет фильтра отрисовщика.
- IGraphBuilder::RenderFile создает полный граф воспроизведения файлов.
- IFilterGraph::AddFilter добавляет фильтр к графу. Фильтр не подключается. Необходимо создать фильтр перед вызовом этого метода путем вызова CoCreateInstance или с помощью средства сопоставления фильтров или перечислителя системных устройств.
Эти методы предоставляют три основных подхода к построению графа:
- Диспетчер фильтров графа создает весь граф.
- Диспетчер графов фильтров создает часть графа.
- Приложение создает весь граф.
Диспетчер фильтров графов создает весь граф
Если вы просто хотите воспроизвести файл, созданный в распознаваемом формате, например AVI, MPEG, WAV или MP3, используйте метод RenderFile . В статье Воспроизведение файла показано, как это сделать.
Метод RenderFile начинается с поиска в реестре фильтра источника, который может анализировать файл. Для определения исходного фильтра используется протокол (например, " https://
" в URL-адресе), расширение файла или предварительно определенные шаблоны байтов в файле. Дополнительные сведения см. в разделе Регистрация пользовательского типа файла.
Чтобы создать остальную часть графа, диспетчер графов фильтров использует итеративный процесс, в котором он принимает типы мультимедиа, поддерживаемые фильтром, в выходных контактах, и ищет в реестре фильтры, которые будут принимать этот тип мультимедиа в качестве входных данных. Он использует несколько критериев для сужения поиска и определения приоритетов фильтров:
- Категория фильтра определяет общие функциональные возможности фильтра.
- Тип носителя описывает тип данных, которые фильтр может принимать в качестве входных данных или доставлять в качестве выходных данных.
- Заслуга определяет порядок, в котором выполняются проверки фильтров. Если два фильтра в одной и той же категории фильтров поддерживают одни и те же типы входных данных, диспетчер графа фильтров выбирает тот, который имеет наибольшее значение. Некоторым фильтрам специально присваивается низкое значение, так как они предназначены для специализированных целей и должны добавляться в граф только приложением.
Диспетчер графов фильтров использует объект Сопоставителя фильтров для поиска в реестре.
При добавлении каждого фильтра диспетчер графа фильтров пытается подключить его к выходному контакту предыдущего фильтра. Фильтры согласовываются, чтобы определить, могут ли они подключаться, и, если да, какой тип носителя использовать для подключения. Если новый фильтр не может подключиться, диспетчер фильтров Graph отменит его и попытается выполнить другой фильтр. Этот процесс продолжается до тех пор, пока не будет отрисовывается каждый поток.
Диспетчер фильтров графов создает часть графа
Чтобы выполнить что-то помимо простого воспроизведения файла, приложение должно выполнить по крайней мере часть работы по созданию графа. Например, приложение для захвата видео должно выбрать фильтр источника захвата и добавить его в граф. При записи данных в AVI-файл необходимо добавить фильтры AVI Mux и File Writer в граф. Однако часто можно позволить диспетчеру фильтров графа завершить работу графа. Например, вы можете отобразить контакт для предварительного просмотра, вызвав метод Render .
Приложение создает весь граф
В некоторых сценариях приложению может потребоваться создать граф путем добавления и подключения каждого фильтра. В этом случае вы, вероятно, знаете, какие фильтры следует добавить в граф. При таком подходе приложение добавляет каждый фильтр, вызывая Метод AddFilter, перечисляет контакты фильтров и подключает их путем вызова Connect или ConnectDirect.
Связанные темы