Как я могу напрямую встроить фильтр DirectShow Push Source в EXE?
У меня есть программа Delphi 6, которая получает звук от внешней программы через сокет. Теперь я хочу передать это аудио в граф фильтра DirectShow, который я создаю, и который направляет это аудио в различные выходные фильтры на ПК. Я использую DSPACK для моей работы с графиком фильтра DirectShow. Я буду использовать один из примеров DSPACK, который показывает, как создать Push Source Filter в качестве отправной точки.
Можно ли встроить фильтр DirectShow непосредственно в мой основной EXE-файл или мне нужно создать внешний файл DLL или AX и запустить на нем regsvr32? Я хотел бы избежать создания внешнего модуля, в противном случае мне придется создать параметр и мост передачи данных между ним и моей основной программой, и я бы предпочел исключить эту работу. Мне интересно, есть ли способ просто включить исходный фильтр-фильтр в мою основную программу и заставить Windows работать с ним как фильтр DirectShow, если это вообще возможно.
2 ответа
Фильтры не нужно помещать в библиотеки (DLL), и они не должны быть даже зарегистрированными COM-объектами, нет. Как уже упоминалось, единственная причина сделать это, чтобы сделать фильтр доступным для приложений через CoCreateInstance и / или путем перечисления категорий DirectShow.
Будучи помещенным в ваше приложение напрямую, оно должно реализовать IBaseFilter
и ты будешь IFilterGraph::AddFilter
это в граф. Преимущество частной фильтрации состоит в том, что вам не нужно реализовывать связь между приложением и фильтром через интерфейс COM, и вы можете использовать собственные / прямые указатели.
Смотрите также сообщение Geraint Использование фильтров без регистрации.
Я думаю, что единственная причина поместить ваши фильтры в DLL - это возможность использовать их в нескольких программах. С другой стороны, если вы поместите свои фильтры в DLL, вы всегда можете использовать их для реализации интерфейса, к которому вы обращаетесь в QI, когда вам это нужно.
В своей работе мне приходилось воспроизводить фильмы, которые хранились в собственном архивном файле. Я сделал источник, у которого был выходной контакт, который правильно описывал формат мультимедиа, а остальные работали автоматически, если я этого хотел. Мне также нужно было использовать собственный рендерер для видео. Все эти вещи были встроены в.exe, который был написан на C++