基于Live555实现RtspServer及高清高码率视频传输优化

基于Live555实现RtspServer及高清高码率视频传输优化

最近做了一些pc和嵌入式平台的RTSP服务器项目,大多数的要求是简单但是功能全面,并且性能还要强劲。综合考虑后,基本都是在基于live555的基础上进行开发,在进行Live555本身的优化以及程序内部视频数据传输的优化后,不仅实现了需求而且性能还超出预期,实现了8Mbps~10Mbps高码率的1080p高清视频的流畅直播。这里将一些优化点分享一下:

为什么基于Live555开发

其实之前我就已经开发过一个RTSP Server程序,并且写了一篇文章进行了介绍“一个RtspServer的设计与实现和RTSP2.0简介”,不过当时开发的目的除了实现RTSP直播以外,主要目的还是简化代码以方便定制,因此并没有完全实现RTSP协议里的所有交互细节,要在它的基础上扩展全面,可能会拖延项目进展。基于项目考虑,选择了自己比较了解也认为比较优秀的RTSP开源项目Live555作为基础,开发RTSP Server程序。

Live555是一个跨平台的流媒体解决方案,以C++为开发语言,实现了RTSP包括服务器-客户端的整套结构,并且支持H.264, H.265, MPEG, AAC等多种视频和音频编码,是很知名的一个开源项目。作为RTSP Server,源码里只有对于本地文件的视频源,不过它的扩展性强,可以在Live555提供的一些基类基础上开发出适合自己项目需求的服务程序。

Live555架构和RTSP数据流程

Live555的核心模块

RTSP服务器和客户端的交互流程

Live555流媒体模块及服务端的处理流程

Live555的流媒体模块基本分为Source和Sink两大部分,当然他们也有一个共同的基类Medium。对服务器来说,Source为数据来源,Sink为数据输出,视频数据就通过MediaSource传递给MediaSink,最终通过RTPInterface网络传输给客户端。一下为服务端所用到的模块以及继承关系:

如同上图所示意的,通过完成自己的ServerMediaSubsession和MediaSource来实现将需要直播的H.264编码数据传递给live555,以实现RTSP直播。

高码率视频数据传输的优化点

对高清高码率的视频画面,每一帧的视频数据就会比较大,这个数值往往会超出live555内部默认的内存处理大小,因为对于live555的优化,主要就是集中在内存缓冲大小的扩大,以及避免内存数据拷贝。以下为根据实际开发和测试所总结出来的有效的优化点:

  1. 扩展帧解析buffer大小,即BANK_SIZE,默认值为150k,根据传输的H264数据帧大小,至少设置为300k。否则超出大小,可能会被Live555抛弃。
  2. 增加OutPacketBuffer::maxSize大小,同样为了容纳超大帧数据,否则可能会导致数据丢失。
  3. 在RTPInterface中,增加socket发送缓冲区大小,即increaseSendBufferTo函数的参数值
  4. 对MultiFramedRTPSink::sendPacketIfNecessary中,可以直接调用sendNext尝试组建RTP报文发送数据包,这样修改的优点是已读取的数据会被尽快发送出去,不过也多占用一些线程时间。
  5. 对于应用程序将数据从自己的线程传递给Live555的时候,应该尽量减少内存拷贝,最好是通过内存池的形式,以避免拷贝内存阻塞Live555事件循环

经过以上修改,以及应用程序内部代码的优化,在实际应用中,已经实现了8Mbps~10Mbps高码率的1080p高清视频的流畅直播。

本文福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端-杂记

1 子域请求时候会默认带上父域下的Coolkie 2 document.cookie 设置cookie只能设置当前域和父域,且path只能是当前页或者/ 比如当前页面地址为 http://localhost:3000/about 我们设置 document.cookie "demo11"; 设置 document.cookie "demo22; …

[ROS2] --- param

1 param介绍 类似C编程中的全局变量,可以便于在多个程序中共享某些数据,参数是ROS机器人系统中的全局字典,可以运行多个节点中共享数据。 全局字典 在ROS系统中,参数是以全局字典的形态存在的,什么叫字典?…

Ubunutu18.04 ROS melodic 无人机 XTDrone PX4 仿真平台配置

一、依赖安装 sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python-pip python3-pip gawk pip2 install pandas jinja2 pyserial cerberus pyulog0.7.0 n…

【uC/OS-II】

uC/OS-II 1. uC/OS-II1.1 代码组成1.2 任务基本概念1.3 任务控制块![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/23fe7cd390b94b7eb06a110b10165d22.png)1.4 任务的状态与切换1.5 任务创建的代码 2 任务2.1 系统任务2.2 任务管理相关函数2.3 任务基本属性2.4 uC/…

IP地址定位技术:追踪位置、识别风险

随着互联网的普及,IP地址定位技术逐渐成为网络安全领域的一项重要工具。通过追踪IP地址位置,可以识别潜在的风险用户,加强网络安全。本文将深入研究IP地址定位技术的原理、应用以及相关的风险与防范。 1. IP地址定位技术的原理: …

架构面试:全链路压测,你是怎么设计的?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业、上市企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 就在前几天,尼恩的指导一个 30岁小伙拿到一个工业互联网上市企业55W年薪的offer,是架构师…

Python数据处理的六种方式总结,Python零基础学习

文章目录 前言1、dedup()去重并排序2、traverse()拆分嵌套数组3、filter()数据筛选4、groupby()分组运算5、select()遍历结果集6、sort()数据排序 总结 前言 在 Python 的数据处理方面经常会用到一些比较常用的数据处理方式,比如pandas、numpy等等。 今天介绍的这…

AI文档助手,当下热门的AI文档助手【2024】

在当今信息爆炸的时代,文档创作的需求愈发庞大。为了满足用户对高效、准确、原创性文档的需求,人工智能技术的应用日益广泛。本文将专心分享AI文档助手领域的热门推荐。 AI文档助手的背景与应用 AI文档助手作为人工智能技术在文档创作领域的一大应用&am…

跨平台的文本编辑器——CudaText

CudaText 是一个轻量级、跨平台的文本编辑器,它免费开源,启动速度非常快,有拓展功能,可安装插件。 下载 浏览器搜索框输入CudaText - Home进行搜索, 选择官网进入, 进入官网界面如下:选择点击…

孩子都能学会的FPGA:第二十六课——用FPGA实现CIC抽取滤波器

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门,作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿…

windows系统如何解决爆满C盘

目录 方法一:清理临时文件 方法二:清理临时文件 方法三:清理系统更新文件 方法四: 设置自动清理无用文件 4.1 清理缓存 4.2 打开存储感知 4.3 调整新内容存储地方 方法一:清理临时文件 代码:win …

Python框架篇(4):FastApi-错误处理

提示: 微信搜索【猿码记】回复 【fastapi】即可获取源码信息~ 1.验证错误 1.1 默认返回 当传参不符合模型验证规则时,默认错误信息和格式返回如下: { "detail": [ { "loc": [ "body", "age" …

22、pytest多个参数化的组合

官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…

科学指南针助力江西高校开展《透射电子显微镜简介及案例分析课程》讲座

2023年11月,科学指南针与江西各大高校合作,共同开展了一场关于《透射电子显微镜的简介及案例分析课程》讲座。该讲座旨在加强学生对于透射电子显微镜的了解,提高他们在科学研究中的实践能力。 透射电子显微镜(简称TEM&#xff09…

【LeetCode】每日一题 2023_12_9 下一个更大的数值平衡数(枚举/打表二分)

文章目录 刷题前唠嗑题目:下一个更大的数值平衡数题目描述代码与解题思路官方解法 结语 刷题前唠嗑 LeetCode?启动!!! 题目:下一个更大的数值平衡数 题目链接:2048. 下一个更大的数值平衡数 …

C++11原子操作atomic

文章目录 原子操作atomic原子操作的相关函数原子操作的特点“平凡的”与“合格的” 原子操作atomic 前面我们介绍了互斥锁等一系列多线程相关操作,这里我们来说下原子操作atomic。 可以理解为原子变量就是将上面的操作进行了整合的一个全新变量,但是实际…

Qt 容器QGroupBox带有标题的组框框架

控件简介 QGroupBox 小部件提供一个带有标题的组框框架。一般与一组或者是同类型的部件一起使用。教你会用,怎么用的强大就靠你了靓仔、靓妹。 用法示例 例 qgroupbox,组框示例(难度:简单),使用 3 个 QRadioButton 单选框按钮,与QVBoxLayout(垂直布局)来展示组框的…

远程控制如何赋能智能制造?贝锐向日葵制造业场景案例解析

随着数字化转型在制造业的不断深入,企业在产线端也逐渐投入更多智能化设备,数字化、智能化设备其中一个比较显著的优势就是可以依托互联网实现远程运维和调试,大大提升产线设备的稳定性和工作效率;而远程调试运维一个重要的实现方…

数据表排序

指针用的有点少了&#xff0c;有点不适应 用的冒泡排序 代码如下&#xff1a; #include<stdio.h> int num[100][100]; int * p[100], jud[100]; int judge(int i, int j, int rank); int m, n, k;int main(void) {scanf("%d%d%d", &m, &n, &k);f…

飞天使-linux操作的一些技巧与知识点

命令行光标移动到行首行尾 ctrl a 跳到首 ctrl e 跳到尾/etc/passwd rpm 包格式 RPM&#xff08;Red Hat Package Manager&#xff09;是一种常用的Linux软件包管理系统&#xff0c;它使用特定的命名规则来标识和命名软件包。RPM包的名称格式通常遵循以下规则&#xff1a;…
最新文章