要在 C# 中调用摄像头录像,可以使用 DirectShow 库。以下是一个简单的示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DirectShowLib;

namespace DirectShowCamera
{
    class Program
    {
        static void Main(string[] args)
        {
            // 初始化 DirectShow 库
            DsDevice[] devices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);

            if (devices.Length == 0)
            {
                Console.WriteLine('No video capture devices found.');
                return;
            }

            // 创建 FilterGraph 对象
            IFilterGraph2 filterGraph = new FilterGraph() as IFilterGraph2;

            // 创建 CaptureGraphBuilder2 对象
            ICaptureGraphBuilder2 captureGraphBuilder = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;

            // 将 FilterGraph 与 CaptureGraphBuilder2 关联
            captureGraphBuilder.SetFiltergraph(filterGraph);

            // 创建视频输入设备过滤器
            IBaseFilter videoSourceFilter = null;
            Guid videoInputDeviceCategory = FilterCategory.VideoInputDevice.guid;

            captureGraphBuilder.FindInterface(ref videoInputDeviceCategory, null, out videoSourceFilter);

            // 添加视频输入设备过滤器到 FilterGraph 中
            filterGraph.AddFilter(videoSourceFilter, 'Video Source');

            // 创建压缩器过滤器(可选)
            IBaseFilter compressorFilter = null;
            Guid compressorCategory = FilterCategory.VideoCompressorCategory.guid;

            captureGraphBuilder.FindInterface(ref compressorCategory, null, out compressorFilter);

            // 添加压缩器过滤器到 FilterGraph 中(可选)
            if (compressorFilter != null)
            {
                filterGraph.AddFilter(compressorFilter, 'Compressor');
            }

            // 创建文件写入过滤器
            IBaseFilter fileWriterFilter = new FileWriter() as IBaseFilter;

            // 设置文件名
            IFileSinkFilter fileSinkFilter = fileWriterFilter as IFileSinkFilter;
            fileSinkFilter.SetFileName('output.avi', null);

            // 添加文件写入过滤器到 FilterGraph 中
            filterGraph.AddFilter(fileWriterFilter, 'File Writer');

            // 连接视频输入设备过滤器和文件写入过滤器
            captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, videoSourceFilter, null, fileWriterFilter);

            // 开始录像
            IMediaControl mediaControl = filterGraph as IMediaControl;
            mediaControl.Run();

            Console.WriteLine('Recording started. Press any key to stop recording.');
            Console.ReadKey();

            // 停止录像
            mediaControl.Stop();

            Console.WriteLine('Recording stopped. Press any key to exit.');
            Console.ReadKey();

            // 释放资源
            Marshal.ReleaseComObject(fileWriterFilter);
            Marshal.ReleaseComObject(videoSourceFilter);
            Marshal.ReleaseComObject(compressorFilter);
            Marshal.ReleaseComObject(filterGraph);
            Marshal.ReleaseComObject(captureGraphBuilder);
        }
    }
}

请注意,此示例代码使用了 DirectShowLib 库,因此需要将其添加到项目中。你可以通过 NuGet 包管理器安装 DirectShowLib 库。

C# 使用 DirectShow 库调用摄像头录制视频

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

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