Я использую DirectShow.NET для создания управления веб-камерой для WPF. Я успешно создал график и могу получить видео с камеры для отображения на моем экране. Тем не менее, видеовыход полностью не зависит от элемента управления WPF, в котором он создается.Приложить видео-окно DirectShow к управлению WPF
Я устанавливаю владельца видеоокна, вызывая videoWindow.put_owner(hWnd)
, где hWnd
- это дескриптор окна в текущее окно WPF. Я получаю эту ручку окна с помощью WindowInteropHelper
.
Вот основная процедура:
public void CaptureVideo()
{
int hr = 0;
IBaseFilter sourceFilter = null;
try
{
hr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);
DsError.ThrowExceptionForHR(hr);
sourceFilter = FindCaptureDevice();
hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");
DsError.ThrowExceptionForHR(hr);
hr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, null, null);
DsError.ThrowExceptionForHR(hr);
Marshal.ReleaseComObject(sourceFilter);
SetupVideoWindow();
hr = this.mediaControl.Run();
DsError.ThrowExceptionForHR(hr);
}
catch
{
Console.WriteLine("An unrecoverable DirectShow error has occurred.");
}
}
И код SetupVideoWindow():
public void SetupVideoWindow()
{
int hr = 0;
Window window = Window.GetWindow(this);
var wih = new WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;
hr = this.videoWindow.put_Owner(hWnd);
DsError.ThrowExceptionForHR(hr);
hr = this.videoWindow.put_WindowStyle(DirectShowLib.WindowStyle.Child | DirectShowLib.WindowStyle.ClipChildren);
DsError.ThrowExceptionForHR(hr);
this.videoWindow.SetWindowPosition(0, 0, (int)this.Width, (int)this.Height);
hr = this.videoWindow.put_Visible(OABool.True);
DsError.ThrowExceptionForHR(hr);
}
Вот изображение того, что происходит:
Последний аргумент вызова 'RenderStream' не имеет смысла. Кроме того, может случиться так, что ваш 'hWnd' равен нулю/null, что объясняет поведение. –
@RomanR. Ах, да, я просто пытался кое-что изложить, и кажется, что я скопировал неправильный код. Я отредактировал его, чтобы отразить фактический код, который я использую, для получения вышеуказанных результатов. Возможно ли, что hWnd равно нулю/null, потому что я использую WPF? Это единственный ответ, который, похоже, я вижу в Интернете. –
Итак, можете ли вы отладить и убедиться, что 'hWnd' отличен от нуля? Для нуля поведение вполне ожидаемо (тем не менее не тот, который вы хотите). Возможно, вы настраиваете его слишком рано, пока ручка даже не существует (выделена). –