【问题标题】:Can't change video capture resolution using c#无法使用 c# 更改视频捕获分辨率
【发布时间】:2010-12-10 20:44:33
【问题描述】:

我正在尝试使用 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 位,因此我无法更改网络摄像头捕获的分辨率,有人知道更好的方法或解决方法吗?

【问题讨论】:

标签: c# directshow webcam video-capture capture


【解决方案1】:

确保在查找 HR 错误代码时使用 DirectShow Error and Success Code list,而不是通用 HR 代码列表。您将从该列表中看到 0x80040209 的实际含义是:

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

您的图表似乎没有连接您的样本采集器过滤器。确保在您的通话中将样品采集器传递给RenderStream

【讨论】:

  • 问题是我无法将我的示例抓取器传递给 RenderStream,它需要一个 IbaseFilter,所以我将我的示例抓取器转换为 IBasefilter 并尝试用它替换上面代码中的 mux 变量,但是那个 mux 变量来自 SetOutFileName() 调用所以我必须使用它,你知道有什么办法吗?
  • 将样本采集器作为中间过滤器传递(null 参数)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 2013-04-29
    • 2016-03-27
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多