无法使用c#更改视频捕获分辨率

我正尝试在C#中使用DirectShowNet更改默认网络摄像头分辨率,从我收集的内容中我需要将其从调用Windows win32 api DLL中的内置VideoInfoHeader类中的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位,所以我无法更改摄像头捕获的分辨率,任何人都知道有更好的方法来做到这一点或如何解决这个问题?


确保在查找人力资源错误代码时,请使用DirectShow错误和成功代码列表查看它们,而不是通用HR代码列表。 您将从该列表中看到0x80040209的实际含义是:

VFW_E_NOT_CONNECTED由于引脚未连接,无法执行操作。

看起来你的图形没有连接你的采样器过滤器。 确保将您的调用中的采样器传递给RenderStream


更改网络摄像头分辨率的正确方法是查询其输出引脚IAMStreamConfig接口。 它可以列出可用的格式和分辨率并选择一个。 如果您运行GraphEditPlus并右键单击相机过滤器的输出引脚,您将能够看到该列表并选择分辨率。 然后你可以生成代码(通过文件菜单),看看它是如何在C#中完成的。

链接地址: http://www.djcxy.com/p/80989.html

上一篇: Can't change video capture resolution using c#

下一篇: C# Microsoft LifeCam HD mjpeg capture