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

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

namespace DirectShowCameraCapture
{
    class Program
    {
        static void Main(string[] args)
        {
            // 获取视频设备
            DsDevice[] videoDevices = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
            if (videoDevices.Length == 0)
            {
                Console.WriteLine('No video devices found.');
                return;
            }

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

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

            // 将 FilterGraph 与 CaptureGraphBuilder2 关联
            int hr = captureGraphBuilder.SetFiltergraph(filterGraph);
            if (hr < 0)
            {
                Console.WriteLine('Failed to set filter graph.');
                return;
            }

            // 创建视频设备过滤器
            Guid videoInputGuid = typeof(VideoInputDeviceCategory).GUID;
            hr = captureGraphBuilder.RenderStream(ref videoInputGuid, ref MediaType.Video, videoDevices[0], null, null);
            if (hr < 0)
            {
                Console.WriteLine('Failed to render video device.');
                return;
            }

            // 创建 FileWriter 过滤器
            IBaseFilter fileWriterFilter = Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid('E436EBB5-524F-11CE-9F53-0020AF0BA770'))) as IBaseFilter;
            hr = filterGraph.AddFilter(fileWriterFilter, 'File Writer');
            if (hr < 0)
            {
                Console.WriteLine('Failed to add file writer filter.');
                return;
            }

            // 设置输出文件名
            IFileSinkFilter fileSinkFilter = fileWriterFilter as IFileSinkFilter;
            hr = fileSinkFilter.SetFileName('output.avi', null);
            if (hr < 0)
            {
                Console.WriteLine('Failed to set output file name.');
                return;
            }

            // 运行过滤图
            IMediaControl mediaControl = filterGraph as IMediaControl;
            hr = mediaControl.Run();
            if (hr < 0)
            {
                Console.WriteLine('Failed to run filter graph.');
                return;
            }

            Console.WriteLine('Press Enter to stop recording...');
            Console.ReadLine();

            // 停止过滤图
            hr = mediaControl.Stop();
            if (hr < 0)
            {
                Console.WriteLine('Failed to stop filter graph.');
                return;
            }

            Console.WriteLine('Recording stopped.');
        }
    }
}

请注意,此示例代码仅演示了如何实现基本的录像功能。如果您需要更复杂的录像功能,例如设置视频分辨率、帧率等,请参考 DirectShow 文档以了解更多信息。

C# Directshow 摄像头录像:使用示例代码

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

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