2016-09-23 4 views
2

Я создаю элемент управления веб-камерой с помощью DirectShow.NET. Я хочу сделать видеоизображение камеры в окне WPF. Что происходит в настоящее время, так это то, что IVMRWindowlessControl9, похоже, не входит в режим без окон и не является родителем для окна, которое я указываю, хотя я называю соответствующие методы.IVMRWindowlessControl9 не отображается в родительском окне WPF

Почему эти методы не вызываются? Есть ли что-то еще, чего я не делаю?

Ниже приведен фрагмент кода соответствующего кода:

IGraphBuilder graphBuilder = (IGraphBuilder) new FilterGraph(); 
ICaptureGraphBuilder2 captureGraphBuilder = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();    
IMediaControl mediaControl = (IMediaControl) this.graphBuilder; 
IBaseFilter renderFilter = (IBaseFilter) new VideoMixingRenderer9(); 

hr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder); 
DsError.ThrowExceptionForHR(hr); 

IBaseFilter sourceFilter = FindCaptureDevice(); 

hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");       
DsError.ThrowExceptionForHR(hr); 

SetCaptureResolution(); 

IVMRFilterConfig9 filterConfig = (IVMRFilterConfig9)renderFilter; 

hr = filterConfig.SetNumberOfStreams(1); 
DsError.ThrowExceptionForHR(hr); 

hr = filterConfig.SetRenderingMode(VMR9Mode.Windowless); 
DsError.ThrowExceptionForHR(hr); 

windowlessControl = (IVMRWindowlessControl9)renderFilter; 

hr = this.graphBuilder.AddFilter(renderFilter, "Video Capture"); 
DsError.ThrowExceptionForHR(hr); 

Window window = Window.GetWindow(this); 
var wih = new WindowInteropHelper(window); 
IntPtr hWnd = wih.Handle; 
hr = windowlessControl.SetVideoClippingWindow(hWnd); 
DsError.ThrowExceptionForHR(hr); 

hr = windowlessControl.SetAspectRatioMode(VMR9AspectRatioMode.LetterBox); 
DsError.ThrowExceptionForHR(hr); 

hr = this.captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, sourceFilter, null, null); 
DsError.ThrowExceptionForHR(hr); 

Marshal.ReleaseComObject(sourceFilter); 

hr = this.mediaControl.Run(); 
DsError.ThrowExceptionForHR(hr); 

Вот изображение того, что происходит (я сделал зеленый фон, чтобы сделать его легче увидеть): WPF & IVMRWindowlessControl9

Это диаграмма фильтра: enter image description here

Чтобы ответить на потенциальный вопрос (потому что у меня была эта проблема до viously), да, hWnd получает set/имеет значение - поэтому windowlessControl имеет указатель на окно.

+0

'SetNumberOfStreams' может быть слишком ранним,' SetRenderingMode' должен [идти первым] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd407299). Окно ActiveMovie - это указание на то, что средство визуализации видео не настроено. Ваш эффективный граф фильтров может быть не тем, который вы ожидаете. См. [Общие сведения о графике фильтра DirectShow] (http://alax.info/blog/1678). В частности, ваш эффективный граф может иметь два средства визуализации. –

+0

@RomanR. http://imgur.com/a/wjjm5 - Вот ссылка на графическое изображение фильтра, которое я захватил во время работы приложения. Это нормально? –

ответ

1

Всплывающее окно «ActiveMovie Window», созданное при запуске графика фильтра, является признаком фильтра визуализации видео, вставленного в конвейер, и работает в режиме по умолчанию, не будучи настроенным на то, чтобы быть частью другого пользовательского интерфейса: встроен как дочернее окно и т. Д. .

вашего реверсирование ваш график проливает свет на то, что происходит:

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

Строка кода, которая дает проблемы является:

hr = this.captureGraphBuilder.RenderStream(PinCategory.Capture, 
    MediaType.Video, sourceFilter, null, null); 

Проблема в том quite typical для тех, кто строит графики, вставляя видео рендерер и ожидая, что они будут собраны и подключены, особенно что иногда работы и такие фрагменты кода можно найти в Интернете.

MSDN говорит:

Если параметр pSink является NULL, метод пытается использовать средство визуализации по умолчанию. Для видео используется видеорекордер, а для аудио он использует DirectSound Renderer.

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

Если у вас уже есть свой рендерер видео, вы можете использовать его в качестве аргумента приемника в этом вызове. Или вы можете избежать RenderStream и постепенно добавлять фильтры, необходимые для того, чтобы все было построено в соответствии с вашими ожиданиями.Или, другой вариант IFilterGraph2::RenderEx вызова вместо с AM_RENDEREX_RENDERTOEXISTINGRENDERERS флагом:

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

+0

Я использовал фильтр рендеринга в качестве параметра приемника. Кажется, он создал предполагаемый график, однако я не получаю отображение видео в окне. Больше нет «ActiveMovie Window», но видео в веб-камере не появляется в окне. Это, как я добавил рендер фильтр: 'час = this.captureGraphBuilder.RenderStream (PinCategory.Capture, MediaType.Video, sourceFilter, нулевой renderFilter);' Это образ того, что окно выглядит следующим образом: http://imgur.com/a/ljMPS. Это изображение нового графика захвата: http://imgur.com/a/FiLOU. –

+1

Вы размещаете рендер с помощью ['IVMRWindowlessControl9 :: SetVideoPosition'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd390550)? Я не вижу этого в коде выше. Кроме того, вы можете обновить свой вопрос (особенно для вставки изображений) –

+0

Отлично. По какой-то причине я не думал, что SetVideoPosition() необходимо для 'IVMRWindowlessControl9'. Но это сделало трюк. Поэтому, в конце концов, это была некоторая комбинация моего фильтра, и вам нужно установить положение видео. –

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