ardupilot开发 --- RTSP视频流 篇

在这里插入图片描述

我年轻时很穷,努力了几年,终于不再年轻了

  • 0. 一些概念
  • 1. Ubuntu搭建RTSP服务器的方式
  • 2. 在Ubuntu上搭建RTSP服务器
  • 3. 推流
  • 4. 拉流、播放
  • 5. 借鉴的一些例子
  • 6. 其他
  • 参考文献

0. 一些概念

  • RTSP服务、RTSP推流、RTSP拉流,缺一不可,尤其是RTSP服务。

  • RTSP服务器、RTSP客户端。推流和拉流都是由客户端发起,向服务器发起对应的请求。RTSP推流一般由RTSP相机或app发起,RTSP拉流一般由上位机的app发起。

  • RTSP服务器默认端⼝是554,在客户端SETUP的时候会把⾃身的RTP和RTCP端⼝告知服务器。在RTSP的session建⽴后,会使⽤RTP/RTCP在约定好的端⼝上传输数据。

  • 向服务端推流
    在这里插入图片描述

  • 从服务端拉流
    在这里插入图片描述

1. Ubuntu搭建RTSP服务器的方式

  • live555
    live555 Media Server

  • gstreamer
    gst-rtsp-server包
    c++编写
    注意:安装gstreamer-1.0时并不会自动安装gst-rtsp-server,gst-rtsp-server需要另行通过make方式安装,如下:

    git clone  -b 1.8 https://github.com/GStreamer/gst-rtsp-server.git  //下载源码
    cd gst-rtsp-server      
    git submodule update --init --recursive
    ./autogen.sh
    sudo make
    sudo make install
    
  • FFmpeg
    搭建不了服务,只能推流或拉流!

  • rtsp-simple-server
    go语言编写

  • EasyDarwin
    easy-darwin

  • ZLMediaKit
    推荐使用!!
    使用文档:https://github.com/ZLMediaKit/ZLMediaKit/wiki/快速开始

2. 在Ubuntu上搭建RTSP服务器

推荐使用ZLMediaKit,以Ubuntu为例:
ZLMediaKit使用文档:https://github.com/ZLMediaKit/ZLMediaKit/wiki/快速开始

  • 下载
    git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit
    cd ZLMediaKit
    git submodule update --init
    # 安装依赖,可选。参考文档
    
  • 编译
    cd ZLMediaKit
    mkdir build
    cd build
    cmake ..
    make -j4
    
  • 运行
    cd ZLMediaKit/release/linux/Debug
    #通过-h可以了解启动参数
    ./MediaServer -h
    # 以守护进程模式启动:主进程关闭自动重启。需要加sudo,因为544端口需要管理员权限!!!!
    sudo ./MediaServer -d &
    # 设置log打印等级:0~4,等级越高越简洁,下图是等级0
    sudo ./MediaServer -d -l 0 &
    
    在这里插入图片描述
  • 关闭服务
    sudo killall -2 MediaServer
    
  • log
    log保存在ZLMediaKit/release/linux/Debug/log中。
  • 推流测试
    要先开启RTSP服务再推流不然会报类似下面的错误:
    在这里插入图片描述
    用ffmpeg 推:
    # ZLMediaKit的RTSP服务默认端口是554,可缺省!/live是参数之一,不能少!!!
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
    
    推流成功后查看ZLMediaKit的log可以得到更多有用的信息:
    在这里插入图片描述
  • 拉流播放测试
    ffplay -rtsp_transport tcp -i rtsp://127.0.0.1:554/live/test
    
    注意:rtsp地址要与推流地址保持一致,不然无法拉取和播放!!注意live是参数不能漏!!

3. 推流

要先开启RTSP服务再推流不然会报类似下面的错误:
在这里插入图片描述

  • ffmpeg
    # ZLMediaKit的RTSP服务默认端口是554,可缺省!/live是参数之一,不能少!!!
    ffmpeg -re -i "/path/to/test.mp4" -vcodec h264 -acodec aac -f rtsp -rtsp_transport tcp rtsp://127.0.0.1/live/test
    
    推流成功后查看ZLMediaKit的log可以得到更多有用的信息:
    在这里插入图片描述
  • opencv + ffmpeg
    int main(int argc, char **argv)
    {//rtspstd::string rtsp_server_url = "rtsp://127.0.0.1:554/live/0";std::stringstream command;command << "ffmpeg ";// inputfile optionscommand << "-y "  // overwrite output files<< "-an " // disable audio<< "-f rawvideo " // force format to rawvideo<< "-vcodec rawvideo "  // force video rawvideo ('copy' to copy stream)<< "-pix_fmt bgr24 "  // set pixel format to bgr24<< "-s 640x480 "  // set frame size (WxH or abbreviation)<< "-r 30 "; // set frame rate (Hz value, fraction or abbreviation)command << "-i - ";// outputfile optionscommand << "-c:v libx264 "  // Hyper fast Audio and Video encoder<< "-pix_fmt yuv420p "  // set pixel format to yuv420p<< "-tune:v zerolatency "<< "-preset ultrafast " // set the libx264 encoding preset to ultrafast<< "-f rtsp " // force format to flv for rtmp, rtsp for rtsp<< rtsp_server_url;FILE *fp = nullptr;try {cv::Mat frame;vpRealSense2 rs2;std::string product_line2 = rs2.getProductLine();//获取相机信息std::cout << "Product line: " << product_line2 << std::endl;rs2::config config2;config2.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_RGBA8, 30);//配置相机config2.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);config2.enable_stream(RS2_STREAM_INFRARED, 640, 480, RS2_FORMAT_Y8, 30);rs2.open(config2);//启动相机vpCameraParameters cam2 = rs2.getCameraParameters(RS2_STREAM_COLOR);//获取相机 内参vpImage<vpRGBa> I2(rs2.getIntrinsics(RS2_STREAM_COLOR).height, rs2.getIntrinsics(RS2_STREAM_COLOR).width);//定义用于二维码检测的 灰度图vpDisplayX display2;display2.init(I2, 100, 100, "DRONE VIEW");vpDisplay::display(I2);vpDisplay::flush(I2);// 在子进程中调用 ffmpeg 进行推流fp = popen(command.str().c_str(), "w");// 将 cv 读到的每一帧传入子进程if (fp != nullptr){std::cout << "fp != nullptr" << std::endl;while (1){rs2.acquire(I2);//获取当前图像//rtspvpImageConvert::convert(I2, frame);if(frame.empty()) continue;fwrite(frame.data, sizeof(char), frame.total() * frame.elemSize(), fp);vpDisplay::display(I2);vpDisplay::flush(I2);}pclose(fp);return 0;}else{pclose(fp);std::cout << "fp == nullptr" << std::endl;return -1;}}catch (const vpException &e) {pclose(fp);std::cout << "Caught an exception: " << e << std::endl;return -1;}
    }
    

4. 拉流、播放

  • gstreamer
    gst-launch-1.0 playbin uri=rtsp://127.0.0.1:554/live/test
    gst-launch-1.0 playbin uri=rtsp://admin:WANGfengtu12@10.0.20.190:554/client0x
    gst-launch-1.0 playbin uri=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x
    gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.70:554/client0x ! rtph264depay ! h264parse ! decodebin ! autovideosink
    gst-launch-1.0 rtspsrc location=rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x ! rtph264depay ! h264parse ! decodebin ! autovideosink
    
  • vlc
    vlc rtsp://127.0.0.1:554/live/test
    
  • ffmpeg
    ffplay -rtsp_transport tcp -i rtsp://127.0.0.1:554/live/test
    
  • opencv拉取RTSP视频流
    cv::VideoCapture cap;
    cap.open("rtsp://admin:WANGfengtu12@10.0.20.61:554/client1x",cv::CAP_GSTREAMER);
    cv::Mat frame;
    while(cv::waitKey(1) < 0) // Press any key to exit
    {if (!cap.read(frame)){cerr << "No frames grabbed!\n";break;}
    }
    }
    
    待续…

5. 借鉴的一些例子

使用ZLMediaKit搭建RTSP服务,使用ffmpeg推流
https://blog.csdn.net/jaket5219999/article/details/135228010
使用gst-rtsp-server搭建RTSP服务,使用gstreamer推流和拉流:
https://blog.csdn.net/Aidam_Bo/article/details/114398506
https://blog.csdn.net/zhngyue123/article/details/126362312

6. 其他

在这里插入图片描述

参考文献

https://www.avdancedu.com/e5aee947/
https://blog.csdn.net/weixin_37210821/article/details/131406193

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/357555.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web实时通信的学习之旅:WebSocket入门指南及示例演示

文章目录 WebSocket的特点1、工作原理2、特点3、WebSocket 协议介绍4、安全性 WebSocket的使用一、服务端1、创建实例&#xff1a;创建一个webScoket实例对象1.1、WebSocket.Server(options[&#xff0c;callback])方法中options对象所支持的参数1.2、同样也有一个加密的 wss:/…

mysql中in参数过多该如何优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in(1022044,1009786)方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list new ArrayList<>();for (int i 0; i < 3000; i) {list.add(""…

RNN循环卷积神经网络

1.定义 RNN &#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;循环卷积神经网络&#xff0c;用于处理序列数据。 序列数据&#xff1a;按照一定的顺序排列的数据&#xff0c;可以是时间顺序、空间顺序、逻辑顺序。 eg:电影、语言 2.特点 传统神经网络模型无法…

Java开发-面试题-0007-GPT和MBR的区别

Java开发-面试题-0007-GPT和MBR的区别 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff08;纯纯技术文&#xff09; 生活公众号&#…

[Shell编程学习路线]——While循环应用技巧 (详细讲解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 基本结构 图示原理 示例 测试 …

Go语言的诞生背景

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

Spark Core内核调度机制详解(第5天)

系列文章目录 如何构建DAG执行流程图 (掌握)如何划分Stage阶段 (掌握)Driver底层是如何运转 (掌握)确定需要构建多少分区(线程) (掌握) 文章目录 系列文章目录引言一、Spark内核调度&#xff08;掌握&#xff09;1.1、内容概述1.2、RDD的依赖1.3、DAG和Stage1.4、Spark Shuffl…

云计算 私有云openstack 搭建指导 【99%成功率】

本人已经搭了很多次&#xff0c;也失败了很多次&#xff0c;这里面有很多失败的经验&#xff0c;以及提示&#xff0c;请按提示搭建&#xff0c;相信你也可以的&#xff01; 不积小流无以成江海&#xff0c;多尝试才能吸取经验 开始搭建openstack 准备文件&#xff08;如果没有…

练手代码之使用Python实现合并PDF文件

如果你有合并PDF的需要&#xff0c;你会怎么办 我们无所不能的程序员会选择写一个Python代码来实现&#xff08;谁会这么无聊&#xff1f;是我&#xff09;&#xff0c;如果真的有PDF操作需要&#xff0c;我推荐你使用PDF Expert这个软件哈~ 话不多说直接上代码&#xff1a; …

Pip换源秘籍:让你的Python包飞行起来!

在Python的包管理中&#xff0c;Pip是最重要的工具之一。它允许开发者从Python Package Index (PyPI)安装包&#xff0c;但有时由于网络问题或服务器负载过高&#xff0c;直接从PyPI安装包可能会非常慢。这时&#xff0c;更换Pip源到一个更快的镜像站点是一个常见的解决方案。本…

版本控制工具-git的基本使用

目录 前言一、git简介二、git工作流程三、git基本命令3.1 创建本地仓库3.2 将工作区内容提交到本地仓库3.3 将本地仓库内容推送到远程仓库 前言 本篇文章介绍git的一般工作流程 一、git简介 Git是一个开源的分布式版本控制软件&#xff0c;常用于项目的版本管理 Git是Linux …

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏&#xff0c;融合了日系RPG经典风格&#xff0c;玩家将控制主角进行未知场景的探索。除了经典地牢玩法外&#xff0c;游戏还添加了更多创意内容&#xff0c;如黑屏状态前的挑战性等&#xff0c;使得游戏更加富有挑战…

AI智能时代:ChatGPT如何在金融市场发挥策略分析与预测能力?

文章目录 一、ChatGPT在金融策略制定中的深度应用客户需求分析与定制化策略市场动态跟踪与策略调整策略分析与优化 二、ChatGPT在算法交易中的深度应用自动交易策略制定交易执行与监控风险管理 三、未来展望《智能量化&#xff1a;ChatGPT在金融策略与算法交易中的实践》亮点内…

Windows10中端口被占用处理方法

前言 在Windows 10中&#xff0c;查看端口被占用情况的方法主要依赖于命令行工具netstat。以下是详细步骤&#xff0c;以及必要的解释和归纳&#xff1a; 打开命令提示符 方法1&#xff1a;使用快捷键Win R&#xff0c;打开“运行”对话框&#xff0c;输入cmd&#xff0c;然…

Linux 进程管理

一、查看进程 使用ps -aux进行查看&#xff0c;其中a表示列出所有进程信息&#xff0c;u以用户格式显示进程信息&#xff0c;x显示后台进程参数&#xff0c;也可以使用| grep 进行进程的筛选 以下是显示进程后的示意 USER为进程执行的用户 PID为进程号 %CPU为该进程的cpu占用…

如何解决vue中的路由守卫失效问题

引言 1. 路由守卫简介 路由守卫是前端开发中一个至关重要的概念&#xff0c;特别是在使用单页应用&#xff08;SPA&#xff09;框架如React、Vue或Angular时。它们充当了SPA中的“门卫”&#xff0c;控制着用户对不同页面的访问权限。路由守卫的核心功能是确保用户在访问特定…

挖矿宝藏之开发者模式

目录 一、开发者模式简介 二、启动方式 三、元素&#xff08;Elements&#xff09; 四、控制台&#xff08;Console&#xff09; 五、来源&#xff08;Sources&#xff09; 六、网络&#xff08;Network&#xff09; 七、性能&#xff08;Performance&#xff09; 八、…

Day10—Spark SQL基础

Spark SQL介绍 ​ Spark SQL是一个用于结构化数据处理的Spark组件。所谓结构化数据&#xff0c;是指具有Schema信息的数据&#xff0c;例如JSON、Parquet、Avro、CSV格式的数据。与基础的Spark RDD API不同&#xff0c;Spark SQL提供了对结构化数据的查询和计算接口。 Spark …

react18 实现具名插槽

效果预览 技术要点 当父组件给子组件传递的 JSX 超过一个标签时&#xff0c;子组件接收到的 children 是一个数组&#xff0c;通过解析数组中各 JSX 的属性 slot &#xff0c;即可实现具名插槽的分发&#xff01; 代码实现 Father.jsx import Child from "./Child";…

OGG几何内核开发-复杂装配模型读取、显示、分析

OGG几何内核读取STEP模型文件的API有STEPCAFControl_Reader、STEPControl_Reader。 STEPCAFControl_Reader使用很复杂&#xff0c;但可以展示装配树&#xff0c;有利于模型的详细分析。 本文演示了《插件化算法研究平台V2》的OCC几何模型插件的部分功能&#xff1a;显示装配树…