FFmpeg接收RTSP流出现RTP丢包告警,是否正常?如何解决?
解答:RTSP拉流时FFmpeg出现丢包/延迟告警的问题
首先明确:这类告警绝对不是正常现象——它们说明你的RTSP流在传输过程中出现了数据包丢失、延迟累积的情况,长期下去可能会导致生成的分段视频出现卡顿、跳帧甚至内容损坏,必须排查解决。
下面分几个维度给你针对性的解决方案:
1. 先排查网络底层问题(最常见原因)
RTSP默认用UDP传输RTP数据包,UDP本身无可靠传输保障,网络波动、带宽不足、路由拥堵都会直接导致丢包:
- 在Linux客户端执行
mtr 192.168.120.157(未安装的话用ping -t 192.168.120.157持续测试),查看是否存在丢包率过高、延迟波动过大的情况。 - 如果是无线连接,优先换成有线网络;如果跨网段传输,检查中间路由器/交换机的负载,避开网络高峰期操作。
2. 优化VLC RTSP服务器的推流配置
调整VLC的传输策略,降低丢包概率:
- 强制用TCP传输RTSP:VLC默认用UDP,你可以在推流设置里找到「RTSP传输方式」,选择「TCP」(可靠传输,不会丢包,仅牺牲少量延迟)。如果是命令行推流,添加参数
--rtsp-tcp。 - 增加服务器端缓存:在VLC推流时加入
--rtsp-caching=500(单位为毫秒,可根据网络情况调整到1000以内),给服务器足够的缓冲时间处理输出流。 - 降低服务器负载:关闭服务器上其他占用CPU/内存的程序,避免因服务器性能不足导致流输出卡顿、丢包。
3. 调整FFmpeg客户端的拉流参数
从客户端侧适配流的特性,减少告警:
- 强制用TCP拉流:在FFmpeg命令开头加上
-rtsp_transport tcp,彻底规避UDP丢包问题,修改后的命令:ffmpeg -rtsp_transport tcp -i rtsp://192.168.120.157:5544/stream -c copy -f segment -segment_time 100 out_%d.mp4 - 延长FFmpeg的缓冲延迟:添加
-max_delay 2000000(单位为微秒,即2秒),让FFmpeg有更长的缓冲时间等待延迟的数据包,减少「max delay reached」告警:ffmpeg -rtsp_transport tcp -max_delay 2000000 -i rtsp://192.168.120.157:5544/stream -c copy -f segment -segment_time 100 out_%d.mp4 - 启用自动重连机制:如果偶尔出现断流丢包,可以加上
-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5,让FFmpeg在异常时自动重连,恢复流传输。
4. 检查视频源文件的兼容性
如果以上方案都试过仍有问题,可能是源文件本身不适合流传输:
- 先用VLC本地播放
test.mp4,确认文件没有损坏、卡顿的情况。 - 用FFmpeg重新转码源文件为更适合流的格式,比如:
然后用转好的ffmpeg -i test.mp4 -c:v libx264 -preset medium -c:a aac -f mp4 test_streamable.mp4test_streamable.mp4作为推流源,兼容性会更好。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

