Directshow - IMediaControl::Run зависает при использовании пользовательских Source, InfTee и AVI Mux

Я использую собственный фильтр источника, чтобы получить потоковое видео из Интернета, не зная, как это работает. Этот фильтр источника предлагает два выходных контакта, которые являются аудио / видео отдельно. Когда я просто использую его для захвата прямой трансляции в файл avi, вот так:Простые подключения

Это сработало хорошо. Однако, когда я пытался сделать предварительный просмотр, оставаясь при этом сохраняемым, я сначала добавил фильтр с бесконечным пин-ти между пользовательским фильтром и AVI Mux, например:Соединения с InfTee

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

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

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

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

Спасибо.:)

1 ответ

Решение

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

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

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

Другие вопросы по тегам