Directshow — остановить и закрыть файл (но повторно использовать график и некоторые фильтры)

Я создаю многопоточный видеоплеер. В настоящее время у меня возникают проблемы с попыткой закрыть файл. Фактически у меня может одновременно воспроизводиться от 1 до 4 видеофайлов. Когда я воспроизводю 4 файла, то в следующей последовательности есть только один, я не могу правильно перерисовать панель видео после удаления фильтра исходного файла.

Я должен сказать, что я строю график и управляю им вручную (чтобы получить дополнительную скорость), включая подключение всех фильтров/рендереров и т. д. Я изучил GMFBridge, но в конечном итоге столкнулся с проблемами синхронизации графика рендеринга и файлового графа. время (такие проблемы, как быстрое воспроизведение (догоняющее из-за временного кодирования) и необходимость одновременного запуска/паузы/остановки/пошагового управления мультимедиа на графиках рендеринга и файла (иногда неудачное воспроизведение)). Граф рендеринга по памяти должен быть настроен правильно, а мой сценарий не совсем вписывался в предоставленный образец (необходимость воспроизведения без видимых причин, но все же требовалось индивидуальное кодирование времени для каждого файла - не объединено в один большой файл).

Я повторно использую объекты IFilterGraph2/VMR/DirectSound на протяжении всего жизненного цикла приложения. Единственное, что меняется, это SourceFilter и необходимые декодеры/демультиплексоры.

Итак, процесс:

  1. Построить график
  2. Добавить визуализатор
  3. Попытка воспроизвести файл - в соответствии с типом файла добавьте исходный фильтр и демультиплексоры/декодеры и т. д. (удалите все устаревшие фильтры)
  4. Соедините фильтры вместе (вручную соедините контакты)
  5. Искать/играть и т. д.
  6. После этого выгрузите текущий исходный файл, вызвав Graph.RemoveFilter(), но оставьте средства визуализации в графе и отключите все выводы.

Я испытал следующую ошибку:

  • Исключение COM+ при закрытии файла (и вызове VMR.RepaintVideo())

РЕДАКТИРОВАТЬ: ошибка такова:

Для этой операции требуется COM+, но он не установлен (исключение из HRESULT: 0x8004020C).

Я вызываю VMR.SetVideoClippingWindow() один раз при добавлении средства визуализации на график.

Есть ли способ выгрузить файл без удаления графа фильтров и перерисовать/очистить окно видео? если на то пошло, есть ли способ перерисовать видео, когда в графе нет фильтра исходного файла?


person Simon    schedule 15.10.2013    source источник


Ответы (1)


  1. Я не думаю, что у вас будет значительный прирост скорости, если вы остановите график и даже отключите контакты.
  2. Ошибка на самом деле не COM+, коды перекрываются и эта ошибка имеет другое значение (какой именно код?)

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

УПД. Ошибка: 0x8004020C VFW_E_BUFFER_NOTSET "Буферное пространство не задано", используйте ShowHresult для декодирования кодов, этот инструмент имеет особый приоритет перед кодами DirectShow, когда он сталкивается с перекрывающимися блоками кода.

person Roman R.    schedule 15.10.2013
comment
Спасибо Роман, Добавил код ошибки. Вы предлагаете вернуться к GMFBridge? это вариант я думаю - person Simon; 15.10.2013
comment
Мы наблюдали разумное увеличение скорости при ручном подключении контактов, от 180 мс вручную до 500 мс, если мы используем интеллектуальное подключение. - person Simon; 15.10.2013
comment
Да, вы можете выиграть время против Intelligent Connect, особенно. когда установлено много фильтров, и он сначала пробует те, которые больше никогда не будет использовать. Вы можете наблюдать за его попытками, глядя на библиотеки DLL, которые он загружает и выгружает. Здесь вы действительно можете что-то улучшить, но если вы хотите сделать еще лучше, вам придется разделить графики. Инициализация модуля рендеринга видео и подключение по контакту сами по себе увеличивают задержку. Я добавил описание кода ошибки выше, вероятно, это происходит из-за того, что фильтр проходит какое-то переходное состояние (остановка и т. д.). - person Roman R.; 15.10.2013
comment
Спасибо Роман, полезно. Был ли у вас опыт работы с GMFBridge? В частности, синхронизация исходных графиков и графиков рендерера? Если мне нужно текущее время файла, я должен использовать IMediaSeeking для файла, а не для графика рендеринга, верно? Есть ли способ запустить граф рендеринга и просто приостановить/остановить/искать граф файла? - person Simon; 15.10.2013
comment
Я никогда не использовал GMFBridge, поэтому я не могу точно указать вам здесь. Возможно, он реализует IMediaSeeking, чтобы вы могли использовать (второй) график IMediaSeeking/IMediaPosition, не задумываясь о том, куда он внутренне перенаправляется. Конечно, вам в конечном итоге придется позаботиться о времени и часах. Вы также можете использовать IMediaSeeking/IMediaPosition первого графика. - person Roman R.; 15.10.2013