C# 使用 DirectShow 库调用摄像头录制视频
要在 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 库。
原文地址: https://www.cveoy.top/t/topic/qqS3 著作权归作者所有。请勿转载和采集!