AForge.NET:未触发 NewFrameEventHandler 参数方法

Posted

技术标签:

【中文标题】AForge.NET:未触发 NewFrameEventHandler 参数方法【英文标题】:AForge.NET: NewFrameEventHandler argument method not triggered 【发布时间】:2021-10-22 22:10:37 【问题描述】:

我正在尝试编写一个 Windows 控制台程序,该程序能够从网络摄像头或虚拟网络摄像头获取图像,从视频源中提取位图帧并将该帧作为位图文件保存到文件系统。

目前我使用一个名为 OBS Studio 的程序来模拟带有“虚拟相机”选项的视频源。

代码如下:

using System;
using AForge.Video.DirectShow;
using AForge.Video;
using System.Drawing;

namespace webcamc

    class Program
    
        FilterInfoCollection filterInfoCollection;
        VideoCaptureDevice videoCaptureDevice;
        Bitmap bitmap;

        static void Main(string[] args)
        
            var program = new Program();
            program._init();
        

        void _handleNewFrameEvent(object sender, NewFrameEventArgs eventArgs)
        
            bitmap = new Bitmap(eventArgs.Frame);
        

        void _init()
        
            filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[0].MonikerString);
            videoCaptureDevice.Start();
            videoCaptureDevice.NewFrame += new NewFrameEventHandler(_handleNewFrameEvent);
           
            string ActiveDir = AppDomain.CurrentDomain.BaseDirectory;
            string filepath = System.IO.Path.Combine(ActiveDir, @"C://Pic");

            string fileName = System.IO.Path.Combine(filepath, @"name.bmp");
            bool fileNotExists = !System.IO.File.Exists(fileName);
            if (fileNotExists)
            
               bitmap.Save(fileName);
            

        

    

不幸的是,我无法理解为什么我传递给NewFrameEventHandler_handleNewFrameEvent 方法没有被触发;我已经用调试器检查了代码并且没有命中断点。 我很确定正确获取了设备列表和设备名称。 但是我非常怀疑videoCaptureDevice 实例。我不确定,但它看起来没有正确实例化,因为所有 相关 值似乎都是 0。

Here is an image of the debugger showing the ill-instantiated video capture device

谁能指点我正确的方向?

谢谢。

【问题讨论】:

【参考方案1】:

我会先将videoCaptureDevice.Start(); 移到videoCaptureDevice.NewFrame += new NewFrameEventHandler(_handleNewFrameEvent); 下方,因为您只想在可以接收到新帧后开始运行相机源(但我不相信这会解决您的问题)。

可能网络摄像头启动时引发错误,因此添加vDevIn.VideoSourceError += new VideoSourceErrorEventHandler(errorHandler) 并使用以下函数查看是否引发任何错误:

    private void errorHandler(object sender, VideoSourceErrorEventArgs eventArgs)

    Console.WriteLine("Video feed source error: " + eventArgs.Description);

【讨论】:

您好,jakehowlet96,感谢您的回复。我已尝试实施您的两个建议,但没有发现任何改进或错误。我用videoCaptureDevice.VideoSourceError += new VideoSourceErrorEventHandler(errorHandler); 对吗?

以上是关于AForge.NET:未触发 NewFrameEventHandler 参数方法的主要内容,如果未能解决你的问题,请参考以下文章

C# Aforge.net 在其他应用程序使用相同的相机时显示相机源

AForge.NET的开发工具

用 aforge.net 小试一下验证码识别

如何使用 Aforge.Net 计算 blob 中连接组件的数量

Aforge.net之旅——开篇:从识别验证码开始

AForge.NET的参考资料