opencvsharp usb摄像头录像 c# H264编码

1.首先创建ConsoleApp,.Net 9.0,不要创建WinFormWInForm帧率和实际对不上,有延时

2.下载opencvsharp。

3.下载openh264-1.8.0-win32.dll , openh264-1.8.0-win64.dll .放在根目录。

https://github.com/cisco/openh264

复制代码
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        private const int CameraIndex = 0;

        private const double Fps = 30.0;
        // private static readonly OpenCvSharp.Size FrameSize = new OpenCvSharp.Size(1280, 720);
        private static readonly OpenCvSharp.Size FrameSize = new OpenCvSharp.Size(640, 480);
        private const int ReconnectInterval = 3000; // 重试间隔(ms)
        private const int MaxReconnectAttempts = 5; // 最大重试次数

        static void Main(string[] args)
        {

            int reconnectAttempts = 0;
            bool isRecording = true;

            while (isRecording && reconnectAttempts < MaxReconnectAttempts)
            {
                try
                {
                    using (var capture = new VideoCapture(CameraIndex))
                    using (var writer = new VideoWriter())
                    {
                        if (!InitializeCamera(capture))
                        {
                            reconnectAttempts++;
                            Thread.Sleep(ReconnectInterval);
                            continue;
                        }
                        string OutputFile = System.DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + "_output.avi";
                        if (!InitializeVideoWriter(writer, OutputFile, Fps, FrameSize))
                        {
                            Console.WriteLine("无法初始化视频写入器!");
                            return;
                        }

                        Console.WriteLine("开始录制,按ESC键停止...");
                        reconnectAttempts = 0; // 重置重试计数器

                        using (var window = new Window("摄像头画面"))
                        using (var frame = new Mat())
                        {
                            while (true)
                            {
                                // 检查摄像头是否仍然连接
                                if (!capture.IsOpened())
                                {
                                    Console.WriteLine("检测到摄像头断开连接!");
                                    break;
                                }

                                // 捕获帧
                                capture.Read(frame);
                                DateTime now = DateTime.Now;
                                Cv2.PutText(frame, now.ToString("yyyy-MM-dd HH:mm:ss"), new Point(10, 30),
                                            HersheyFonts.HersheySimplex, 0.6, Scalar.White, 1);
                                if (frame.Empty())
                                {
                                    Console.WriteLine("接收到空帧,可能摄像头已断开!");
                                    break;
                                }

                                // 显示帧
                                window.ShowImage(frame);

                                // 写入帧到文件
                                writer.Write(frame);

                                // 按ESC键退出
                                if (Cv2.WaitKey(10) == 27)
                                {
                                    isRecording = false;
                                    break;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"发生错误: {ex.Message}");
                }

                if (isRecording && reconnectAttempts < MaxReconnectAttempts)
                {
                    Console.WriteLine($"尝试重新连接({reconnectAttempts + 1}/{MaxReconnectAttempts})...");
                    reconnectAttempts++;
                    Thread.Sleep(ReconnectInterval);
                }
            }

            if (reconnectAttempts >= MaxReconnectAttempts)
            {
                Console.WriteLine($"已达到最大重试次数({MaxReconnectAttempts}),停止尝试。");
            }

            Console.WriteLine("程序结束");
        }

        static bool InitializeCamera(VideoCapture capture)
        {
            if (!capture.IsOpened())
            {
                Console.WriteLine("无法打开摄像头!");
                return false;
            }

            // 设置摄像头参数
            capture.Set(VideoCaptureProperties.FrameWidth, FrameSize.Width);
            capture.Set(VideoCaptureProperties.FrameHeight, FrameSize.Height);
            capture.Set(VideoCaptureProperties.Fps, Fps);

            // 验证实际设置的值
            double actualWidth = capture.Get(VideoCaptureProperties.FrameWidth);
            double actualHeight = capture.Get(VideoCaptureProperties.FrameHeight);
            Console.WriteLine($"摄像头分辨率: {actualWidth}x{actualHeight}");

            return true;
        }

        static bool InitializeVideoWriter(VideoWriter writer, string filename, double fps, Size frameSize)
        {
            // 尝试几种常见的编码格式
            Dictionary<string, FourCC> _codecs = new Dictionary<string, FourCC>()
            {
                 {"X264", FourCC.X264},
                 {"XVID", FourCC.XVID},
                 {"MJPG", FourCC.MJPG},
                 {"H264", FourCC.H264},
                 {"MP4V", FourCC.MP4V},
                 {"DIVX", FourCC.DIVX}
            };

            foreach (var codec in _codecs)
            {
                writer.Open(filename, codec.Value, fps, frameSize, true);
                if (writer.IsOpened())
                {
                    Console.WriteLine($"使用编码器: {codec.Key}");
                    return true;
                }
            }

            Console.WriteLine("无法找到合适的视频编码器!");
            return false;
        }
    }
}

4.运行。

整个工程打包下载:

【免费】opencvsharpusb摄像头录像c#H264编码资源-CSDN文库

相关推荐
EnCi Zheng1 分钟前
P2G-Python字符串方法完全指南-split、join、strip、replace的Python编程利器
开发语言·python
爱学习的小囧3 分钟前
VCF 9 实验室网络部署全攻略:从硬件连接到配置实操
开发语言·网络·php
liliangcsdn14 分钟前
LLM如何与mcp server交互示例
linux·开发语言·python
军军君0120 分钟前
Three.js基础功能学习十五:智能黑板实现实例二
开发语言·前端·javascript·vue.js·3d·threejs·三维
维齐洛波奇特利(male)23 分钟前
@Pointcut(“execution(* com.hdzx..*(..))“)切入点与aop 导致无限循环
java·开发语言
来日可期131433 分钟前
C/C++ 反常识记录(1)—— 那些容易踩坑的语法细节
c语言·开发语言·c++
实心儿儿40 分钟前
C++ —— C++11(2)
开发语言·c++
立莹Sir1 小时前
云原生全解析:从概念到实践,Java技术栈如何拥抱云原生时代
java·开发语言·云原生
geovindu1 小时前
go: Factory Method Pattern
开发语言·后端·golang
前进的李工1 小时前
智能Agent实战指南:从入门到精通(工具)
开发语言·人工智能·架构·langchain·agent·tool·agentexecutor