首页 > 解决方案 > AForge.NET:未触发 NewFrameEventHandler 参数方法

问题描述

我正在尝试编写一个 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);
            }

        }

    }
}

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

这是调试器的图像,显​​示了错误实例化的视频捕获设备

谁能指出我正确的方向?

谢谢你。

标签: c#webcamaforgevirtual-webcam

解决方案


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

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

    private void errorHandler(object sender, VideoSourceErrorEventArgs eventArgs)
{
    Console.WriteLine("Video feed source error: " + eventArgs.Description);
}

推荐阅读