我正在尝试编写一个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。
这是调试器的图像,显示了实例化不良的视频捕获设备
谁能告诉我正确的方向?谢谢。
我会首先将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);
}