Я пытаюсь изменить разрешение веб-камеры по умолчанию с помощью DirectShowNet в С#, из того, что я понимаю, мне нужно изменить его с вызова встроенного класса VideoInfoHeader в Windows win32 api dll для захвата avi. У меня есть следующий код из DirectShowNet:
hr = capGraph.SetFiltergraph( graphBuilder );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
AMMediaType media = new AMMediaType();
media.majorType = MediaType.Video;
media.subType = MediaSubType.RGB24;
media.formatType = FormatType.VideoInfo; // ???
hr = sampGrabber.SetMediaType(media);
if (hr < 0)
Marshal.ThrowExceptionForHR(hr);
hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
DsUtils.ShowCapPinDialog( capGraph, capFilter, this.Handle );
Guid sub = MediaSubType.Avi;
hr = capGraph.SetOutputFileName( ref sub, fileName, out mux, out sink );
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
Guid cat = PinCategory.Capture;
Guid med = MediaType.Video;
hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, mux ); // stream to file
if( hr < 0 )
Marshal.ThrowExceptionForHR( hr );
media = new AMMediaType();
hr = sampGrabber.GetConnectedMediaType(media);
if (hr < 0)
Marshal.ThrowExceptionForHR(hr);
if ((media.formatType != FormatType.VideoInfo) || (media.formatPtr == IntPtr.Zero))
throw new NotSupportedException("Unknown Grabber Media Format");
videoInfoHeader = (VideoInfoHeader)Marshal.PtrToStructure(media.formatPtr, typeof(VideoInfoHeader));
Marshal.FreeCoTaskMem(media.formatPtr); media.formatPtr = IntPtr.Zero;
Дело в том, что я не могу получить доступ к videoInfoHeader, потому что в этой строке: hr = sampGrabber.GetConnectedMediaType(media); он идет и говорит, что hr меньше 0, поэтому выдает эту ошибку: интерфейс имеет слишком много методов для запуска событий (исключение из HRESULT: 0x80040209)
Он не будет читать бит VideoInfoHeader, поэтому я не могу изменить разрешение захвата веб-камеры, кто-нибудь знает лучший способ сделать это или как это исправить?