基于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)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

相关推荐
简鹿办公23 分钟前
如何提取某站 MV 视频中的音乐为 MP3 音频
音视频·简鹿视频格式转换器·视频提取mp3音频
yufengxinpian29 分钟前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
runing_an_min2 小时前
ffmpeg视频滤镜:替换部分帧-freezeframes
ffmpeg·音视频·freezeframes
runing_an_min4 小时前
ffmpeg视频滤镜:提取缩略图-framestep
ffmpeg·音视频·framestep
小曲曲5 小时前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
安静读书8 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
佑华硬盘拷贝机8 小时前
音频档案批量拷贝:专业SD拷贝机解决方案
音视频
EasyNVR8 小时前
NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案
安全·音视频·监控·视频监控
xcLeigh15 小时前
HTML5超酷响应式视频背景动画特效(六种风格,附源码)
前端·音视频·html5
韩曙亮17 小时前
【FFmpeg】FFmpeg 内存结构 ③ ( AVPacket 函数简介 | av_packet_ref 函数 | av_packet_clone 函数 )
ffmpeg·音视频·avpacket·av_packet_clone·av_packet_ref·ffmpeg内存结构