RTSP推流方案调优

RTSP推流方案调优

96 
耐寒  作者 
2017.02.21 14:48*  字数 906  阅读 852 评论 3 赞赏 1

本项目是一个互联网音频广播得项目,其中APP推音频流到EasyDarwin服务器,云喇叭(音响,使用wifi联网)从EasyDarwin上拉流解码播放,但是在公司里测试时,老是出现播放卡顿的问题(公司网络不太稳定),前后大约耗时3个星期才从根本原因上解决问题。定位解决的过程大致如下:

一、一开始从源码去分析的,因为MP3一帧播放的时长大约是26.12毫秒,但是IOS得APP在填写RTP包的时间戳时舍去了0.12毫秒,直接填写26毫秒,也是起一个定时器,每隔26毫秒去推送一帧数据的,但是如果遇到网络情况不好的情况,那么不断每隔26毫秒去推送,那么会导致网络上的包越来越多,更加导致网络状况差,另一个方面,如果网络状态好时,因为这0.12毫秒的累积,最后也有可能导致拉流端的缓冲被填满的风险。于是做了第一次优化,优化方案就是使用了live555的taskschedule的机制,起了一个延时任务,在该任务里先记下上一帧推送RTP包后的系统时间戳(lastFrameTimestamp),然后记下推送当前帧的系统时间戳(currentTimeStamp),如果currentTimeStamp - lastFrameTimestamp的差值大于一帧数据的播放时长,则提前发送,提前的时间是delaySendTime = frameduration - (currentTimeStamp - g_lastFrameTimestamp - frameduration),同时把这个差值累积起来(deltaDelayTime),如果该差值达到了一帧数据的播放时长,则立马发送下一帧数据。整个的核心代码如下,当然这也要感谢live555封装了一个如此实用的BasicUsageEnvironment模块,而且是可以单独编译的:



图1 推流的延时任务函数

二、使用了上面这个方案后,卡顿的现象好了很多,但是在公司里测试时依然发现会出现卡顿,于是继续find the root cause,这时不再怀疑推流方案会有什么问题了,同时也设置了TCP_NODELAY选项,这个时候感觉有点计穷力竭了,不断抓包分析后,某一个突然时刻发现有些RTP包的ACK延时一段时间后才收到,后来经过精确计算发现大约延时40毫秒,敏感的神经告诉我这非常可能就是引起网络拥塞导致音频直播卡顿的原因,于是网上查找为什么会有这个40毫秒的延时确认的现象,于是找到了这篇博客(再探Linux下的TCP延迟确认机制--TCP_QUICKACK  ),按照该博客的提醒设置了TCP_QUICKACK选项,但是问题依旧,后来再经过不断的debug,发现该选项没有起作用,该选项在实时操作系统中才会生效,当然中间还试过BBR拥塞算法,但是没有什么改观,于是编译了实时操作系统替换了流媒体服务器的现有操作系统。

最后一测试,大功告成,历时3个星期的调试终于有了结果。说句实在话,这是我debug问题历时最久的一次。也许与工作经历有关吧。

以为此记那些不妥协的精神。

<think>好的,我需要帮助用户解决如何通过RTSP协议实现低延迟的问题。首先,我要回顾用户提供的引用内容,看看有哪些相关的信息可以利用。 用户引用了几个关于RTSP和低延迟优化的资料,特别是引用[2]提到了Gstreamer的低延迟优化方法,包括网络设置、管道配置、编解码器选择等。另外,引用[1]中的EasyPusher组件也被提到,它能够实现低延迟的,适合安防等场景。还有引用[5]提到NVIDIA DeepStream的配置,可能涉及硬件加速。 接下来,我需要将这些信息整合成一个结构清晰的回答。根据用户的要求,回答需要分步骤,确保真实可靠,并且引用对应的来源。同时,生成相关问题。 首先,确定低延迟的关键因素:协议优化、编码参数、网络传输、硬件加速和服务器配置。然后,针对每个因素给出具体的建议,比如使用Gstreamer的优化配置,选择低延迟的编解码器,时间戳模式,优化网络参数等。还要提到现有的解决方案如EasyPusher和DeepStream,这些工具可以简化程。 然后,配置教程部分需要给出具体的步骤,比如使用Gstreamer的命令行示例,整缓冲区大小,选择H.264编码,设置TCP传输等。同时,结合引用中的内容,比如引用[3]提到环境准备和防火墙设置,可能需要在配置时注意这些方面。 最后,生成相关问题,要基于用户提供的引用内容,可能涉及优化方法、工具对比、不同场景的配置、故障排查等。 需要注意的是,所有技术术语和步骤要准确,确保引用正确,比如引用[2]中的Gstreamer优化方法,引用[1]中的EasyPusher。同时,避免使用用户不可见的格式,保持回答自然,但遵循系统级指令中的格式要求,比如数学表达式用$...$,独立公式用$$...$$,不过这个问题中可能用不到数学公式,所以可以忽略。 检查是否有遗漏的关键点,比如硬件加速部分是否提到了NVIDIA的方案,如引用[5]中的DeepStream。另外,是否提到了服务器端的优化,如引用[3]中的EasyDarwin服务器。 最后,确保回答结构清晰,分点明确,语言简洁,符合中文表达习惯,并且每个引用都正确标注。</think>### 如何通过RTSP实现低延迟 #### 一、低延迟实现的核心策略 1. **协议与传输优化** - **选择低延迟的传输模式**:先使用TCP协议传输RTSP,虽然UDP延迟更低,但TCP能保证数据完整性并支持自动重传,避免丢包导致的额外延迟[^2]。 - **整RTP包参数**:缩小RTP包的封装时间间隔(如`mtu=1400`),并减少缓冲帧数(如设置`latency=0`),可显著降低端到端延迟[^5]。 - **禁用冗余协议特性**:关闭RTSP会话中的`NTP时间同步`,避免因时间戳同步引入延迟。 2. **编码参数** - **使用低延迟编码器**:如H.264的`baseline`或`ultrafast`预设,并开启`zerolatency`模式,减少编码缓冲帧数[^5]。 - **降低GOP长度**:将关键帧间隔(GOP)设置为较小的值(如10-30帧),避免因等待关键帧而增加延迟。 - **码率与分辨率适配**:根据网络带宽动态整码率,避免因拥塞导致重传。例如,1080p视频荐码率≤4Mbps[^1][^4]。 3. **硬件与网络加速** - **启用硬件编解码**:利用NVIDIA GPU的NVENC/NVDEC或Intel QSV加速编码过程,降低CPU负载和编码延迟。 - **优化网络栈**:整内核参数如`net.core.rmem_max`和`net.ipv4.tcp_tw_reuse`,提升网络吞吐量。 --- #### 二、配置实践与工具荐 1. **基于Gstreamer的配置** ```bash # 示例:摄像头采集+硬件编码+RTSP(延迟≤300ms) gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! nvvidconv ! "video/x-raw(memory:NVMM),format=NV12" \ ! nvv4l2h264enc preset=2 zerolatency=1 bitrate=4000000 ! h264parse ! rtph264pay config-interval=1 pt=96 \ ! queue max-size-buffers=0 max-size-time=0 ! udpsink host=目标服务器IP port=5004 ``` - **关键参数**: - `zerolatency=1`:启用零延迟编码模式。 - `config-interval=1`:减少SPS/PPS头信息重复发送频率。 2. **使用专用组件** - **EasyPusher方案**:通过封装好的API实现低延迟,支持Android/iOS/Windows多平台,默认优化后延迟可控制在300-500ms。 ```java // Android示例:屏幕采集 EasyPusher.setVideoEncoderType(EasyPusher.VIDEO_CODEC_H264); EasyPusher.setLatencyMode(EasyPusher.LATENCY_MODE_REALTIME); EasyPusher.startPublish("rtsp://server_ip:554/live"); ``` 3. **服务器端优化** - **选择高效媒体服务器**:如EasyDarwin或Nginx-RTMP,支持快速转发和低缓冲配置[^3]。 - **整服务器缓冲区**:限制接收缓冲区大小(如EasyDarwin中设置`recv_buffer_size=64k`),避免数据积压。 --- #### 三、性能验证与 1. **延迟测量方法** - **端到端测试**:在端插入时间戳水印,播放端计算解码时间差,荐工具:Wireshark + FFmpeg。 - **Gstreamer内置统计**:通过`identity signal-handoffs=TRUE`打印帧处理时间戳[^2]。 2. **常见问题解决** - **卡顿与花屏**:检查编码器是否开启B帧(建议禁用)或GOP过长,同时确保网络带宽稳定。 - **时间戳跳跃**:在管道中插入`rtpjitterbuffer latency=50`,平滑时间戳波动[^2]。 --- #### 四、典型应用场景 1. **安防监控**:通过IP摄像头+EasyPusher实现实时画面传输,延迟≤500ms。 2. **工业遥控**:基于Gstreamer低延迟,满足远程机械控制的实时性要求[^5]。 3. **直播互动**:结合WebRTC或HLS低延迟模式,实现主播与观众实时交互[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值