C# 使用 DirectShow 库调用摄像头并截图
要在 C# 中调用摄像头并截图,可以使用 DirectShow 库。下面是一个简单的示例代码:
using System;
using System.Drawing;
using System.Windows.Forms;
using DirectShowLib;
namespace WebcamCapture
{
public partial class MainForm : Form
{
private DsDevice[] _webcamDevices;
private IFilterGraph2 _filterGraph;
private ISampleGrabber _sampleGrabber;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
// 获取所有视频输入设备
_webcamDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
// 初始化 Filter Graph 和 Sample Grabber
_filterGraph = new FilterGraph() as IFilterGraph2;
_sampleGrabber = new SampleGrabber() as ISampleGrabber;
// 添加视频输入设备到 Filter Graph
var sourceFilter = CreateFilter(_webcamDevices[0]);
_filterGraph.AddFilter(sourceFilter, 'Webcam');
// 添加 Sample Grabber 到 Filter Graph
var sampleGrabberFilter = (IBaseFilter)_sampleGrabber;
_filterGraph.AddFilter(sampleGrabberFilter, 'Sample Grabber');
// 连接视频输入设备和 Sample Grabber
var sourcePin = GetPin(sourceFilter, PinDirection.Output);
var grabberPin = GetPin(sampleGrabberFilter, PinDirection.Input);
_filterGraph.Connect(sourcePin, grabberPin);
// 设置 Sample Grabber 的回调函数
_sampleGrabber.SetCallback(new SampleGrabberCallback());
// 开始捕获视频
var mediaControl = (IMediaControl)_filterGraph;
mediaControl.Run();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 停止捕获视频
var mediaControl = (IMediaControl)_filterGraph;
mediaControl.Stop();
// 释放资源
_sampleGrabber.SetCallback(null);
_sampleGrabber = null;
_filterGraph = null;
}
private IBaseFilter CreateFilter(DsDevice device)
{
object filterObject = null;
Guid videoInputDeviceGuid = typeof(IBaseFilter).GUID;
device.Mon.BindToObject(null, null, ref videoInputDeviceGuid, out filterObject);
return (IBaseFilter)filterObject;
}
private IPin GetPin(IBaseFilter filter, PinDirection direction)
{
IEnumPins enumPins;
filter.EnumPins(out enumPins);
IPin[] pins = new IPin[1];
IntPtr fetched = IntPtr.Zero;
while (enumPins.Next(1, pins, fetched) == 0)
{
PinDirection pinDirection;
pins[0].QueryDirection(out pinDirection);
if (pinDirection == direction)
{
return pins[0];
}
}
return null;
}
private class SampleGrabberCallback : ISampleGrabberCB
{
public int BufferCB(double sampleTime, IntPtr buffer, int bufferLen)
{
// 这里可以处理图像数据,例如保存到文件
var bitmap = new Bitmap(640, 480, bufferLen, System.Drawing.Imaging.PixelFormat.Format24bppRgb, buffer);
bitmap.Save('screenshot.jpg');
return 0;
}
public int SampleCB(double sampleTime, IMediaSample sample)
{
return 0;
}
}
}
}
这个示例代码使用 DirectShow 库来调用摄像头并捕获视频帧。在 MainForm_Load 方法中,它获取所有视频输入设备,然后创建 Filter Graph 和 Sample Grabber,并将视频输入设备和 Sample Grabber 连接在一起。在 SampleGrabberCallback 的 BufferCB 方法中,它将图像数据保存到文件。
请注意,你需要在项目中引用 DirectShow 库(DirectShowLib)。你可以使用 NuGet 包管理器来安装 DirectShowLib。
原文地址: https://www.cveoy.top/t/topic/qqQv 著作权归作者所有。请勿转载和采集!