C# OpenCvSharp读取rtsp流录制mp4

效果

 项目

代码

using OpenCvSharp;
using OpenCvSharp.Extensions;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OpenCvSharp读取rtsp流录制mp4
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        CancellationTokenSource cts;
        VideoCapture capture;
        Mat frame;
        private volatile bool SaveFlag = false;
        private VideoWriter VideoWriter;

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBoxIP.Text == "" || textBoxPort.Text == "" ||
               textBoxUserName.Text == "" || textBoxPassword.Text == "")
            {
                MessageBox.Show("Please input IP, Port, User name and Password!");
                return;
            }

            String rtspUrl = string.Format("rtsp://{0}:{1}@{2}:{3}"
                , textBoxUserName.Text
                , textBoxPassword.Text
                , textBoxIP.Text
                , textBoxPort.Text
                );

            button1.Enabled = false;
            button2.Enabled = true;

            cts = new CancellationTokenSource();
            Task task = new Task(() =>
            {
                capture.Open(rtspUrl, VideoCaptureAPIs.ANY);
                if (capture.IsOpened())
                {
                    int time = Convert.ToInt32(Math.Round(1000 / capture.Fps));
                    frame = new Mat();
                    //var dsize = new System.Windows.Size(capture.FrameWidth, capture.FrameHeight);
                    while (true)
                    {
                        Thread.Sleep(time);
                        //判断是否被取消;
                        if (cts.Token.IsCancellationRequested)
                        {
                            pictureBox1.Image = null;
                            frame = null;
                            return;
                        }
                        //Read image 会阻塞线程
                        capture.Read(frame);
                        if (frame.Empty())
                            continue;

                        if (SaveFlag && VideoWriter != null)
                        {
                            VideoWriter.Write(frame);
                        }

                        if (pictureBox1.Image != null)
                        {
                            pictureBox1.Image.Dispose();
                        }
                        pictureBox1.Image = BitmapConverter.ToBitmap(frame);
                    }
                }

            }, cts.Token);
            task.Start();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;
            button1.Enabled = true;
            cts.Cancel();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (capture != null)
            {
                capture.Release();
                capture.Dispose();
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            capture = new VideoCapture();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (frame != null)
            {   //图片保存路径和文件名 the path and file name to save
                String sJpegPicFileName = "JPEG_test.jpg";
                String str = "Successful to capture the JPEG file and the saved file is " + sJpegPicFileName;
                Mat dst = frame.Clone();
                Cv2.ImWrite(sJpegPicFileName, dst);
                dst.Dispose();
                MessageBox.Show(str);
            }
        }

        //录像保存路径和文件名 the path and file name to save
        string sVideoFileName = "Record_test.mp4";

        private void button4_Click(object sender, EventArgs e)
        {
            if (capture == null || capture.IsDisposed)
            {
                return;
            }

            if (!capture.IsOpened()) return;

            button4.Enabled = false;
            button5.Enabled = true;

            VideoWriter = new VideoWriter(sVideoFileName, FourCC.MPG4, capture.Fps, new OpenCvSharp.Size(capture.FrameWidth, capture.FrameHeight));
            SaveFlag = true;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            button5.Enabled = false;
            button4.Enabled = true;

            SaveFlag = false;
            if (VideoWriter != null && !VideoWriter.IsDisposed)
            {
                VideoWriter.Dispose();
                VideoWriter = null;
                string str = "Successful to stop recording and the saved file is " + sVideoFileName;
                MessageBox.Show(str);
            }
        }
    }
}

Demo下载

猜你喜欢

转载自blog.csdn.net/lw112190/article/details/132203744