C# DirectShow 摄像头调用教程
要在 C# 中调用摄像头,可以使用 DirectShow 库。DirectShow 是 Windows 多媒体框架的一部分,它提供了一种在应用程序中捕获和处理音频和视频数据的方法。
以下是使用 DirectShow 调用摄像头的基本步骤:
-
添加对 DirectShow 库的引用。在 Visual Studio 中,右键单击项目,选择'添加'->'引用',然后在 COM 选项卡中找到并选择'DirectShow'。
-
创建一个 FilterGraph 对象。FilterGraph 是 DirectShow 中的一个核心对象,它用于建立和管理数据流图。
using DirectShowLib; // 创建 FilterGraph 对象 IFilterGraph2 filterGraph = (IFilterGraph2)new FilterGraph(); -
枚举摄像头设备并创建视频捕获过滤器。首先,使用 SystemDeviceEnum 对象枚举视频输入设备,然后使用 Moniker 属性获取设备的唯一标识符,最后使用 BindToObject 方法创建视频捕获过滤器。
// 枚举视频输入设备 DsDevice[] videoDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice); // 获取第一个设备的唯一标识符 string deviceMoniker = videoDevices[0].MonikerString; // 创建视频捕获过滤器 IBaseFilter videoCaptureFilter = null; filterGraph.AddSourceFilterForMoniker(deviceMoniker, null, 'Video Capture', out videoCaptureFilter); -
创建 SampleGrabber 过滤器和回调函数。SampleGrabber 过滤器用于捕获视频帧,回调函数用于处理捕获的帧数据。
// 创建 SampleGrabber 过滤器 ISampleGrabber sampleGrabber = (ISampleGrabber)new SampleGrabber(); // 设置 SampleGrabber 参数 sampleGrabber.SetMediaType(new AMMediaType { majorType = MediaType.Video }); // 添加 SampleGrabber 过滤器到 FilterGraph IBaseFilter sampleGrabberFilter = (IBaseFilter)sampleGrabber; filterGraph.AddFilter(sampleGrabberFilter, 'Sample Grabber'); // 创建回调函数 SampleGrabberCallback callback = new SampleGrabberCallback(); // 设置回调函数 sampleGrabber.SetCallback(callback, 1); -
连接 FilterGraph 中的过滤器。通过调用 Connect 方法,将视频捕获过滤器连接到 SampleGrabber 过滤器。
// 连接视频捕获过滤器和 SampleGrabber 过滤器 filterGraph.ConnectDirect(GetPin(videoCaptureFilter, 'Capture'), GetPin(sampleGrabberFilter, 'Input'), null); -
开始捕获视频。调用 Run 方法开始捕获视频数据。
// 开始捕获视频 IMediaControl mediaControl = (IMediaControl)filterGraph; mediaControl.Run(); -
处理捕获的视频帧数据。在 SampleGrabberCallback 类中实现 SampleCB 方法,可以在此方法中处理捕获的视频帧数据。
public class SampleGrabberCallback : ISampleGrabberCB { public int SampleCB(double sampleTime, IMediaSample pSample) { // 处理捕获的视频帧数据 return 0; } }
这些是使用 DirectShow 调用摄像头的基本步骤。你可以根据自己的需求进行进一步的扩展和定制。
原文地址: https://www.cveoy.top/t/topic/qqBA 著作权归作者所有。请勿转载和采集!