| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Почему так непредсказуемо ведут себя фильтры DS? |
| Автор: Dims 28.10.2009, 15:40 |
| Ничего не понимаю в этом DirectShow! Первоначально думал, что всё просто и логично, но в конце концов начинает казаться, что в системе царит полнейший хаос и неразбериха. В общем, вывод телевизионной картинки и звука я освоил. Теперь пытаюсь создать приложение, которое выводит на экран субтитры CC. Создаю программно граф из фильтров, сохраняю его в файл, а потом смотрю, что получается в программе GraphEdt. Иногда пытаюсь что-то подредактировать, чтобы понять происходящее. В мануале написано http://msdn.microsoft.com/en-us/library/dd407354%28VS.85%29.aspx что CC Decoder надо подключить к выходу VBI устройства захвата через фильтр непонятного назначения Tee/Sink-to-Sink. Возникают следующие вопросы: 1) Как найти нужный фильтр в списке? По русски есть два фильтра "Преобразователь Tee/Sink-to-sink" в группах "Устройства расщепления WDM потока" и "Преобразователи связи WDM потока". Это один и тот же фильтр или два разных с одним названием? В мануале написано, что фильтр "appears in the "WDM Streaming Tee/Splitter Devices" filter category (AM_KSCATEGORY_SPLITTER)". Видимо, правильный перевод "расщепление", но как в этом убедиться? 2) Как идентифицировать фильтр, который уже присутствует на графе? Программно я кладу фильтр из категории AM_KSCATEGORY_SPLITTER. Как определить его в списке фильтров GraphEdt? 3) У меня не получается соединить вручную фильтры из GraphEdt, почему? 4) Программно попытка соединить фильтры оказывается успешной (ошибок не возникает). Но если я открываю сохранённый файл, то там фильтры Tee и CC оказываются разъединены. Причём, если я открываю файл в какой-то другой момент, то фильтры могут быть и соединены, причём у фильтра Tee образуется второй выход, который и соединяется с CC Decoder. В общем, либо я чего-то крупно не понимаю, либо мелкософты откровенно наваяли чего ни попадя. Второе нежелательно, ибо как тогда жить? |
| Автор: AndreySol 30.10.2009, 08:41 | ||||
Для однозначной идентификации фильтров используется GUID - глобальный уникальный идентификатор. Если Вы в окне добавления фильтров GraphEdit'а щелкните название нужного фильтра, то внизу в окошке "Filter Moniker" вы увидите два GUID'а, взятые в скобки и разделенные слешем - первый это GUID категории фильтра, а второй - это GUID самого фильтра. Вот пример как добавить фильтр в граф, используя его GUID:
с аргументами ф-ции я думаю и так все понятно |
| Автор: Dims 30.10.2009, 10:33 |
| А если я открыл граф, созданный и записанный в другой программе? На графе уже есть фильтры. Как посмотреть ИХ гуиды и т.п.? |
| Автор: AndreySol 7.11.2009, 19:08 |
| Ну проще всего, открыть там-же в GraphEdit'е окно добавления фильтра в граф и поискать там требуемые фильтры по названиям. |
| Автор: Dims 8.11.2009, 10:10 |
Невозможно! При добавлении фильтра на граф я могу дать ему произвольное название, которое может не совпадать с названием в каталоге. Я уж не говорю о том, что идентифицировать по названиям объекты, у которых нет названий, некорректно. |
| Автор: AndreySol 12.11.2009, 08:29 |
| Ну тогда никак |