C# 使用DirectShow.NET从网络摄像头捕获帧
我是DirectShow的新手,所以我不太了解这个库的某些部分。 我已经看到了示例DxSnap,但我需要在不预览的情况下捕获帧,以便进一步处理。我该怎么做呢?如果您主要关心的是“访问网络摄像头”,而不是“使用DirectShow访问网络摄像头”,那么我会看一下。我用DirectShow试过一次,只是为了发现我可以用更少的代码在更短的时间内对多个视频源做同样的事情C# 使用DirectShow.NET从网络摄像头捕获帧,c#,.net,webcam,directshow.net,C#,.net,Webcam,Directshow.net,我是DirectShow的新手,所以我不太了解这个库的某些部分。 我已经看到了示例DxSnap,但我需要在不预览的情况下捕获帧,以便进一步处理。我该怎么做呢?如果您主要关心的是“访问网络摄像头”,而不是“使用DirectShow访问网络摄像头”,那么我会看一下。我用DirectShow试过一次,只是为了发现我可以用更少的代码在更短的时间内对多个视频源做同样的事情 下面是一些示例代码:您可以自己构建一个。如果您查看windows sdk 7.0~文件夹,您可以进入“示例”>“多媒体”>“direc
下面是一些示例代码:您可以自己构建一个。如果您查看windows sdk 7.0~文件夹,您可以进入“示例”>“多媒体”>“directshow>”,其中应该有一个“过滤器”文件夹,向您展示如何制作通用过滤器,以及如何使用您想要的工具,以下是一个示例。如图所示构造一个Windows窗体
- WinForm本身被命名为Form1
- “录制…”标签名为“LBL录制”
- 组合框的名称为cbCameraDevices
- “停止”按钮名称为按钮1
- “复制”按钮名称为按钮2
- “开始”按钮名称为btnStartVideo
- 还有一个名为pictureBox1的pictureBox,其中将显示视频图像
- Windows 10-X64(英特尔计算机)
- Visual Studio 2017社区
- .NET Framework 4.5李>
- 一部电影
- 一部电影
- 阿福尔
谢谢你的回答!但我必须用directshow来做。我听说过很多关于Forge框架的事,但我的客户不知道用DirectShow.NET=(好吧,我想最终它归结为DirectShow,所以Forge只会简化这个过程。但这就是与客户打交道时得到的结果:-)仅供参考,Forge.NET只适合视频(不捕捉音频…)@遗憾的是,我花了一周的时间在一个项目上,发现这个库也限制了我捕捉音频,但若我能从相机的静止针脚中获取图像呢?问题是,当我启动捕获图时,有一个带有视频预览弹出窗口的窗口。如果使用视频渲染器,将创建一个窗口弹出窗口。我搞不清楚您是要捕获到文件还是要捕获到程序。如果你想捕获到一个文件,你可以做摄像头->智能T恤->AVI Mux->文件编写器。如果要捕获到程序/代码,则必须创建过滤器并在过滤器中捕获图像
using System;
using System.Drawing;
using System.Windows.Forms;
using CameraDevice;
using AForge.Video.DirectShow;
using System.Threading;
namespace CameraCaptureTest3
{
public partial class Form1 : Form
{
CameraImaging camImg;
bool StopVideo = true;
Thread thrVideo;
object mImageLock;
FilterInfoCollection videoDevices;
public Form1()
{
InitializeComponent();
camImg = new CameraImaging();
mImageLock = new object();
// enumerate video devices
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
cbCameraDevices.Items.Clear();
foreach(FilterInfo i in videoDevices) cbCameraDevices.Items.Add(i.Name);
}
//---------------------------------------------------------
// VideoRecordin() is meant to be run on a separate thread
//---------------------------------------------------------
private void VideoRecording()
{
camImg.videoSource.Start();
while (!StopVideo)
{
lock (mImageLock)
{
Bitmap tmp = (Bitmap)camImg.bitmap.Clone();
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() =>
{
pictureBox1.Image = tmp;
pictureBox1.Invalidate();
}));
}
else
{
pictureBox1.Image = tmp;
pictureBox1.Invalidate();
}
}
Thread.Sleep(33);
}
camImg.videoSource.Stop();
}
private void btnStartVideo_Click(object sender, EventArgs e)
{
StopVideo = false;
try
{
camImg.videoSource = new VideoCaptureDevice(camImg.videoDevices[cbCameraDevices.SelectedIndex].MonikerString);
thrVideo = new Thread(VideoRecording);
thrVideo.Start();
Thread.Sleep(1000);
lblRecording.Visible = true;
}
catch (Exception)
{
MessageBox.Show("No camera is chosen.", "Exception", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
StopVideo = true;
if (thrVideo != null) thrVideo.Join();
lblRecording.Visible = false;
Application.DoEvents();
}
private void button1_Click(object sender, EventArgs e)
{
StopVideo = true;
if (thrVideo != null)
while (thrVideo.ThreadState == ThreadState.Running)
Application.DoEvents();
pictureBox1.Image = null;
lblRecording.Visible = false;
}
private void button2_Click(object sender, EventArgs e)
{
Clipboard.SetImage(pictureBox1.Image);
}
}
}