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
相关推荐
超梦dasgg9 分钟前
Java 生产环境 MQ 技术选型全解析
java·开发语言·java-rocketmq·java-rabbitmq
不会编程的懒洋洋21 分钟前
VisionPro 中 几何相交工具 Geometry-Intersection
图像处理·笔记·c#·视觉检测·机器视觉·visionpro
桀人1 小时前
C++——模板初阶(收录在专栏C++入门到精通)
开发语言·c++
一直有一个ac的梦想1 小时前
cmu15445 2025fall lec 18 transactions with two-phase lock
java·开发语言·数据库
2601_957879331 小时前
短视频矩阵的数据驱动运营:从流量监测到内容迭代的完整技术链路
大数据·矩阵·音视频
JAVA社区1 小时前
Java进阶全套教程(四)—— SpringMVC框架详解
java·开发语言·spring·面试·职场和发展
Lumbrologist1 小时前
【C++】零基础入门 · 第 2 节:变量、基本数据类型与输入输出
java·开发语言·c++
码完就睡1 小时前
C语言——动态内存
c语言·开发语言
xyq20242 小时前
Java 数组
开发语言