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

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

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文库

相关推荐
zhanghaha13141 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
释厄6231 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
UIU1142 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
Fruit_Caller2 小时前
static
开发语言·c++
CSharp精选营7 小时前
我用 ASP.NET Core 做了个水稻病虫害检查系统
c#·毕业设计·.net core·码农刚子
唐青枫8 小时前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
下页、再停留8 小时前
【C#桌面客户端系列学习-2】在原来窗口基础上打开新窗口
c#·visual studio
Behavior8 小时前
Unity 手游 iOS Deep Link 唤醒全流程:从 URL Scheme / Universal Links 到 C# 层参数投递
c#·unity3d·游戏开发
我是唐青枫8 小时前
我用 C# 开发了一款电子发票自动整理工具
c#·.net
codigger8 小时前
ObjectSense:一门千行内核、把可靠性写进骨子里的面向对象脚本语言
开发语言·编程·编程语言