使用FFmpeg向Mediasoup注入RTMP流时出现随机卡顿该如何解决
可行修复方案
方案1:配置折中(改造成本最低)
- 先修改Mediasoup对应Producer的配置,关闭NACK、PLI检测:因FFmpeg不会响应这两类RTCP重传请求,Mediasoup等待重传超时时会触发卡顿,关闭后会直接跳过丢包数据,借助视频编码的错误隐藏能力恢复,避免长时间卡顿
- 调整FFmpeg推流参数:
- 缩短关键帧间隔,将原命令的
-g 60改为-g 30,每1秒生成一个关键帧,就算出现严重丢包也能更快恢复画面 - 给每个RTP输出地址添加发送缓冲区和分片优化参数,避免IP分片丢包,优化后输出部分改为:
"[select=a:f=rtp:ssrc=11111111:payload_type=101]rtp://52.29.30.225:41299?rtcpport=40612&pkt_size=1200&sndbuf=1048576|[select=v:f=rtp:ssrc=22222222:payload_type=102]rtp://52.29.30.225:44083?rtcpport=48791&pkt_size=1200&sndbuf=1048576" - 缩短关键帧间隔,将原命令的
- 开启Mediasoup Producer的错误隐藏配置,降低丢包对画面的影响
方案2:新增RTP代理层(改造成本中等,完全解决重传问题)
在FFmpeg和Mediasoup之间部署一个轻量RTP代理服务:
- 代理侧缓存最近10秒的音视频RTP包
- 代理负责和Mediasoup交互RTCP信令,收到NACK请求时直接从缓存中返回对应序号的RTP包
- 收到PLI请求时,可通过FFmpeg的远程控制接口触发实时生成关键帧,推送到Mediasoup完成画面刷新
方案3:更换推送链路(无需修改FFmpeg逻辑)
不直接用FFmpeg输出RTP到Mediasoup,调整推送链路:
- FFmpeg先把编码好的流以RTSP/SRT/本地RTP协议推到本机的libmediasoupclient进程
- 由原生支持WebRTC重传机制的libmediasoupclient将流推送到Mediasoup,完全兼容Mediasoup的NACK、PLI逻辑
方案4:使用带RTP重传补丁的FFmpeg
目前社区已有开源补丁为FFmpeg的RTP复用器增加NACK响应、PLI处理能力,自行编译打了对应补丁的FFmpeg版本即可直接支持重传机制,无需调整现有推送流程。
内容的提问来源于stack exchange,提问作者HM Moniruzzaman
相关产品推荐
相关产品推荐

