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

发布于:2025-05-27 ⋅ 阅读:(108) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到