2013-10-14 7 views
0

Я использую настраиваемый фильтр источника, чтобы получить поток видео в реальном времени из Интернета, не зная, как он работает. Этот исходный фильтр предлагает два выходных вывода, которые являются аудио/видео отдельно. Когда я просто использую его для захвата livestream в файл avi, вот так: Simple ConnectionesDirectshow - IMediaControl :: Run зависает при использовании настраиваемого источника, InfTee и AVI Mux

Это сработало хорошо. Однако, когда я пытаюсь сделать предварительный просмотр в то время как все еще остается отлов, я первый добавил фильтр Infinite Pin Tee между настраиваемым фильтром и AVI Mux, как это: Connections with an InfTee

Тогда граф в GraphEdit просто не может быть запущен (Когда я нажал кнопку «Начать график», он ничего не делает и не дает никакой реакции).

(пс:. Я думал, что это лучше, используя Infinite Tee вместо смарта-Tee здесь, потому что пользовательский фильтр выглядит не фильтр захвата)

Я попытался написать Визуальный-C++ код делая то же самое, просто используя CoCreateInstance, IGraphBuilder :: AddFilter и IGraphBuilder :: Connect. Чтобы узнать, что случилось, и что такое HRESULT. Затем я обнаружил, что программа зависла, когда вызывается IMediaControl :: Run. (Экземпляр IMediaControl был запрошен из экземпляра IGraphBuilder).

Я не знаю, почему это так будет вести себя, и я не знаю, как отлаживать это. Так кто-нибудь дает мне помощь или подсказку?

спасибо. :)

ответ

1

Если у вас есть исходный код для настраиваемого исходного фильтра, вы можете просто вломиться и увидеть контекст тупика самостоятельно.

Типичная проблема с потоком с несколькими источниками контактов - это доставка образца в один поток. Даже если это имеет смысл, следует избегать этого, поскольку фильтры нисходящего потока, которые блокируют потоковое вещание по соображениям согласования потоков или повышения скорости, не знают о повторном использовании потоков и в конечном итоге блокируют мертвые.

Если у вас есть исходный код для исходного фильтра, убедитесь, что доставка образца разделена между потоками. В противном случае создайте вспомогательный фильтр, который реализует асинхронную очередь с использованием рабочего потока, и соедините выходные выводы источника, за исключением первого вывода, через эти фильтры.

+0

Спасибо за советы! У меня есть исходный код этого настраиваемого фильтра и искал, что делает его блокировкой. Наконец, я понял, что у меня неправильная версия этого фильтра. Затем я перестроил его для того же соединения, и он больше не блокирует, но некоторые другие ошибки произошли. Тем не менее я не знаю, почему произошли эти ошибки, но в любом случае ваша логика правильная. Это мне очень помогло. Спасибо! –

Смежные вопросы