C#实现摄像头视频录制与保存

C#实现摄像头视频录制与保存,包含系统原生API和第三方库两种实现方式


一、使用Windows Media Capture API(原生方案)

csharp 复制代码
using Windows.Media.Capture;
using Windows.Media.MediaProperties;
using Windows.Storage;
using System.Threading.Tasks;

public class VideoRecorder
{
    private MediaCapture _mediaCapture;
    private StorageFile _outputFile;
    private bool _isRecording = false;

    // 初始化摄像头
    public async Task InitializeAsync()
    {
        _mediaCapture = new MediaCapture();
        var settings = new MediaCaptureInitializationSettings
        {
            StreamingCaptureMode = StreamingCaptureMode.Video
        };
        await _mediaCapture.InitializeAsync(settings);
    }

    // 开始录制
    public async Task StartRecordingAsync(string fileName)
    {
        if (_isRecording) return;

        _outputFile = await KnownFolders.VideosLibrary.CreateFileAsync(
            fileName, CreationCollisionOption.GenerateUniqueName);

        var encodingProfile = MediaEncodingProfile.CreateMp4(
            VideoEncodingQuality.Auto);
        
        await _mediaCapture.StartRecordToStorageFileAsync(
            encodingProfile, _outputFile);
        _isRecording = true;
    }

    // 停止录制
    public async Task StopRecordingAsync()
    {
        if (!_isRecording) return;

        await _mediaCapture.StopRecordAsync();
        _isRecording = false;
        _mediaCapture.Dispose();
    }
}

// 使用示例
var recorder = new VideoRecorder();
await recorder.InitializeAsync();
await recorder.StartRecordingAsync("my_video.mp4");
// 执行其他操作...
await recorder.StopRecordingAsync();

二、使用AForge.NET第三方库

csharp 复制代码
using AForge.Video;
using AForge.Video.DirectShow;
using System.Drawing;
using System.IO;

public class AForgeRecorder
{
    private VideoCaptureDevice _videoSource;
    private AVIWriter _aviWriter;
    private bool _isRecording = false;

    // 初始化摄像头
    public void Initialize()
    {
        FilterInfoCollection devices = new FilterInfoCollection(
            FilterCategory.VideoInputDevice);
        
        if (devices.Count == 0)
            throw new Exception("未检测到摄像头设备");

        _videoSource = new VideoCaptureDevice(devices[0].MonikerString);
        _videoSource.VideoResolution = 
            _videoSource.VideoCapabilities[0]; // 选择最高分辨率
    }

    // 开始录制
    public void StartRecording(string fileName)
    {
        _aviWriter = new AVIWriter("WMV", 
            _videoSource.VideoResolution.FrameWidth,
            _videoSource.VideoResolution.FrameHeight);
        
        _videoSource.NewFrame += (sender, e) => 
        {
            _aviWriter.WriteVideoFrame(e.Frame);
        };
        
        _videoSource.Start();
        _isRecording = true;
    }

    // 停止录制
    public void StopRecording()
    {
        if (!_isRecording) return;

        _videoSource.SignalToStop();
        _aviWriter.Close();
        _isRecording = false;
    }
}

// 使用示例
var recorder = new AForgeRecorder();
recorder.Initialize();
recorder.StartRecording("recorded_video.avi");
// 执行其他操作...
recorder.StopRecording();

三、关键参数配置

参数项 原生方案配置方法 AForge方案配置方法
视频分辨率 MediaCaptureInitializationSettings中的VideoDeviceController VideoCaptureDevice.VideoResolution
帧率 MediaCaptureInitializationSettings中的MaxFrameRate VideoCaptureDevice.DefaultFrameRate
编码格式 MediaEncodingProfile指定视频编码类型 AVIWriter构造函数指定编码格式
保存路径 KnownFolders指定系统文件夹 自定义文件路径

四、高级功能实现

1. 实时预览窗口
csharp 复制代码
// 原生方案预览
public async Task StartPreviewAsync()
{
    var previewWindow = new CaptureElement();
    previewWindow.Source = _mediaCapture;
    await _mediaCapture.StartPreviewAsync();
}

// AForge方案预览
public void StartPreview(Control control)
{
    control.Controls.Add(new PictureBox {
        Image = _videoSource.GetCurrentVideoFrame(),
        Dock = DockStyle.Fill
    });
}
2. 视频压缩设置
csharp 复制代码
// 原生方案H.264压缩
var profile = MediaEncodingProfile.CreateMp4(
    VideoEncodingQuality.Highest);
profile.Video.Codec = VideoCodec.H264;

// AForge方案调整码率
AVIWriter writer = new AVIWriter("WMV", width, height);
writer.VideoStreamInfo.Bitrate = 2000000; // 2Mbps

五、异常处理与资源管理

csharp 复制代码
public class SafeRecorder : IDisposable
{
    private bool _disposed = false;

    // 原生方案资源释放
    public void Dispose()
    {
        if (!_disposed)
        {
            _mediaCapture?.Dispose();
            _disposed = true;
        }
    }

    // AForge方案资源释放
    public void SafeStop()
    {
        try
        {
            _videoSource?.SignalToStop();
            _aviWriter?.Close();
        }
        catch (Exception ex)
        {
            // 记录日志
        }
    }
}

参考代码 c#调用本地摄像头录制视频并保存 www.youwenfan.com/contentcsj/59163.html

六、完整项目结构

复制代码
VideoRecorderApp/
├── src/
│   ├── VideoRecorder.sln
│   ├── NativeRecorder/ (原生方案实现)
│   │   ├── MainPage.xaml
│   │   └── VideoService.cs
│   └── AForgeRecorder/ (第三方方案实现)
│       ├── RecorderForm.cs
│       └── VideoProcessor.cs
├── assets/
│   └── default_icon.png
└── docs/
    └── 开发指南.md
相关推荐
油丶酸萝卜别吃8 小时前
utils.js 说明文档
开发语言·javascript·ecmascript
leisoo809711 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
不会代码的小猴11 小时前
21. 泛型编程上
开发语言·c++·笔记·算法
启雀AI12 小时前
AI 驱动的视频课程自动摘要与知识点提取:ASR + LLM 流水线工程实践
人工智能·阿里云·华为云·音视频·培训saas平台
一只旭宝12 小时前
细讲C加加【9】C++ std::function与std::bind详解|仿函数、绑定器、类成员绑定、占位符、成员偏移指针
开发语言·c++·算法
椒颜皮皮虾྅13 小时前
OpenVINO C# API 3.3.1:支持OpenVINO 2026.3及GenAI增强
人工智能·c#·openvino
FinelyYang14 小时前
基于 LiveKit 实现一对一视频通话:从信令到媒体进房的完整实践
音视频·媒体
coder!mq14 小时前
说几个常见的语法糖?
java·开发语言·算法
gugucoding14 小时前
38. 【Java】Stream API(下):高级操作与性能
java·开发语言
Lhan.zzZ15 小时前
在 Visual Studio 2022 中打造可扩展的动态链接库模块:从零搭建到原理解析
开发语言·c++·visual studio