要在 C# 中调用摄像头,可以使用 DirectShow 库。DirectShow 是 Windows 多媒体框架的一部分,它提供了一种在应用程序中捕获和处理音频和视频数据的方法。

以下是使用 DirectShow 调用摄像头的基本步骤:

  1. 添加对 DirectShow 库的引用。在 Visual Studio 中,右键单击项目,选择'添加'->'引用',然后在 COM 选项卡中找到并选择'DirectShow'。

  2. 创建一个 FilterGraph 对象。FilterGraph 是 DirectShow 中的一个核心对象,它用于建立和管理数据流图。

    using DirectShowLib;
    
    // 创建 FilterGraph 对象
    IFilterGraph2 filterGraph = (IFilterGraph2)new FilterGraph();
    
  3. 枚举摄像头设备并创建视频捕获过滤器。首先,使用 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);
    
  4. 创建 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);
    
  5. 连接 FilterGraph 中的过滤器。通过调用 Connect 方法,将视频捕获过滤器连接到 SampleGrabber 过滤器。

    // 连接视频捕获过滤器和 SampleGrabber 过滤器
    filterGraph.ConnectDirect(GetPin(videoCaptureFilter, 'Capture'), GetPin(sampleGrabberFilter, 'Input'), null);
    
  6. 开始捕获视频。调用 Run 方法开始捕获视频数据。

    // 开始捕获视频
    IMediaControl mediaControl = (IMediaControl)filterGraph;
    mediaControl.Run();
    
  7. 处理捕获的视频帧数据。在 SampleGrabberCallback 类中实现 SampleCB 方法,可以在此方法中处理捕获的视频帧数据。

    public class SampleGrabberCallback : ISampleGrabberCB
    {
        public int SampleCB(double sampleTime, IMediaSample pSample)
        {
            // 处理捕获的视频帧数据
            return 0;
        }
    }
    

这些是使用 DirectShow 调用摄像头的基本步骤。你可以根据自己的需求进行进一步的扩展和定制。

C# DirectShow 摄像头调用教程

原文地址: https://www.cveoy.top/t/topic/qqBA 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录