Я создаю элемент управления веб-камерой с помощью 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);
Вот изображение того, что происходит (я сделал зеленый фон, чтобы сделать его легче увидеть):
Чтобы ответить на потенциальный вопрос (потому что у меня была эта проблема до viously), да, hWnd
получает set/имеет значение - поэтому windowlessControl имеет указатель на окно.
'SetNumberOfStreams' может быть слишком ранним,' SetRenderingMode' должен [идти первым] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd407299). Окно ActiveMovie - это указание на то, что средство визуализации видео не настроено. Ваш эффективный граф фильтров может быть не тем, который вы ожидаете. См. [Общие сведения о графике фильтра DirectShow] (http://alax.info/blog/1678). В частности, ваш эффективный граф может иметь два средства визуализации. –
@RomanR. http://imgur.com/a/wjjm5 - Вот ссылка на графическое изображение фильтра, которое я захватил во время работы приложения. Это нормально? –