Я разработал простой видеоредактор с использованием С# и DirectShow.net. На данный момент у меня есть график фильтров DirectShow, построенный с использованием служб DirectShow Editing Services. Мое приложение управляет графиком, запускает, приостанавливает и останавливает воспроизведение в окне предварительного просмотра по мере необходимости. В сеансе редактирования график изменяется в соответствии с пользовательскими запросами для добавления, удаления или изменения носителя.
В настоящее время я использую PictureBox, завернутый в WindowsFormsHost, для просмотра отредактированных видео. Но я действительно хочу попробовать использовать Jeremiah Morrils WPF MediaKit. (Http://wpfmediakit.codeplex.com)
Первоначальная линия мышления (мой подход грубой силы) заключалась в том, чтобы передать IGraphBuilder и IPin из моего графика в функцию OpenSource() в MediaUriPlayer.cs в WPF MediaKit, так что визуализатор VMR9 добавлен и подключен к моему существующему графику вместо создания нового графика, как это сделано в исходном OpenSource(). Это не сработало хорошо, и я отказался от попыток различных комбинаций и большую часть времени получал ошибку "COM-объект, отделенный от базовой RCW".
После первоначального сбоя я обыскал и наткнулся на Morrills аналогичный VideoRendererElement на http://videorendererelement.codeplex.com. Похоже, что слишком сложно добавить образец грабежа на мой график DirectShow и использовать его для отправки образцов в VideoRendererElement. Это будет похоже на пример веб-камеры, который включен в VideoRendererElement.
Наконец, Im задается вопросом, не будет ли возможно использовать любой из новых элементов управления из WPF MediaKit таким же образом, то есть путем передачи образцов из образца grabber в моем графике в MediaUriElement, DvdPlayerElement или другой элемент управления из коллекции WPF MediaKit. По сути мой вопрос: может ли кто-нибудь рекомендовать WPF MediaKit или VideoRenderingElement реализовать этот сценарий захвата образца? Или, возможно, кто-то может предложить еще лучший способ для моего DES сделать граф фильтра для рендеринга в элемент управления WPF...
Выполнение этого из памяти.
Поскольку это похоже на то, что у вас есть собственный график DirectShow. Я бы просто кивнул WPF MediaKit для нескольких вещей:
Возьмите базовый класс D3DRenderer. Это должно облегчить визуализацию содержимого D3D с помощью D3DImage. Возьмите распределитель VMR9 и материал для взаимодействия D3D9.
Я предполагаю, что вы используете VideoMixingRenderer9... Итак, в вашем коде при создании VMR9, получите интерфейс VMR9, который позволяет вам установить пользовательский распределитель (пример должен быть в методе CreateRenderer в baseclass.cs). Сделайте экземпляр настраиваемого распределителя, который вы подключили к MediaKit, и передайте его интерфейсу. Этот распределитель имеет событие, которое срабатывает, когда он получает новую поверхность d3d и когда новый кадр готов к представлению. Убедитесь, что класс D3DRenderer получает эти события (новая поверхность, новый кадр). Должно быть 90% копирование и вставка:)