一、互联网环境推流,网络抖动是常态
做互联网直播推流,不管是摄像头 RTSP 源,还是电脑采集推流,公网环境网络抖动、短暂断网属于常态。很多新手直接复制一份 ffmpeg 推 HLS 直播的命令,本地内网测试一切流畅,部署到公网实际环境,一旦网络出现波动,就出现各种异常。
常见现象:短暂断网之后,ffmpeg 进程直接退出,直播直接断掉;就算 ffmpeg 自动重连成功,M3U8 没有打上 #EXT‑X‑DISCONTINUITY 不连续标记,网页播放花屏、音画不同步;反复重连之后磁盘 TS 分片疯狂堆积。
很多人以为 ffmpeg 自带参数就可以完美处理一切网络抖动,实际上 ffmpeg 本身的重连参数只是基础,还需要外层 shell 脚本做进程保活,同时处理重连之后的 M3U8 标记问题。
很多坑在内网千兆网络完全复现不了,只有公网真实网络抖动的时候才会暴露。调试推流重连相关问题,我会使用 m3u8live.cn,观察推流断开又恢复之后,M3U8 清单是否生成不连续标记,网页会不会出现花屏。
二、FFmpeg 推流网络抖动高频踩坑
坑 1:只依靠 ffmpeg 的‑reconnect 参数,没有外层进程保活
ffmpeg 的 reconnect 相关参数,只能处理推流链路短暂抖动。遇到严重断流、源彻底断开,ffmpeg 进程依旧会直接退出。只靠 ffmpeg 内部参数,进程退出之后直播彻底中断,不会自动重启。
解决方案:需要 shell 脚本循环监控 ffmpeg 进程,进程退出自动拉起。
坑 2:重连恢复推流,没有输出 #EXT‑X‑DISCONTINUITY 标记
网络断开,之后推流重新恢复,分片时间戳发生跳变,如果 M3U8 没有打上不连续标记,hls.js 不会重置解码器,播放到该位置出现花屏、音画错位。
坑 3:反复重连,旧 TS 分片大量堆积,磁盘占用持续上涨
推流反复断开重启,每一次重启都会生成一批新分片,旧分片没有清理,磁盘爆满。很多人只设置 hls_list_size,但是该参数只控制 M3U8 清单,磁盘文件不会自动删除。
坑 4:重连之后 GOP 错乱,分片不满足 independent‑segments 要求
网络恢复之后输出的分片首帧不是 I 帧,用户 DVR 回看、拖拽跳转的时候偶现花屏。
坑 5:忽略源本身断开的情况
RTSP 摄像头源掉线,就算网络正常,源端没有数据输入,ffmpeg 也会直接停止输出 HLS 分片,重连参数对源端失效。
三、简单可行的处理方案
- ffmpeg 增加源端重连参数,应对链路短暂抖动;同时外层写 shell 脚本,检测 ffmpeg 进程状态,进程异常退出自动重启。
- 推流发生断开重连,切片逻辑必须输出
#EXT‑X‑DISCONTINUITY不连续标记,通知播放器重置解码上下文。 - 配置分片定时清理脚本,清理超过回看窗口的旧 TS 分片,不要依赖 ffmpeg 自动清理。
- 开启
‑hls_flags independent_segments,保证每一个分片首帧是 I 帧,提升重连之后拖拽回看稳定性。 - 增加监控告警:监控 M3U8 清单是否持续产生新分片,当长时间没有新分片产生,触发告警通知运维。
四、验证重连恢复的实操步骤
第一步,启动 ffmpeg 推 HLS 直播,网页调试工具加载 M3U8 正常播放。 第二步,手动断开推流源网络,等待十几秒,恢复网络,模拟真实公网抖动。 第三步,观察 M3U8 原始文本,确认重连位置出现 #EXT‑X‑DISCONTINUITY 标记,网页播放不会花屏音画错位。 第四步,查看磁盘分片目录,确认过期分片会被定时脚本清理。
五、总结
公网环境做 FFmpeg HLS 直播推流,网络抖动属于常态。仅仅配置 ffmpeg 内部 reconnect 重连参数是不够的,严重断流依旧会造成进程退出,需要外层脚本做进程保活。推流恢复之后必须输出不连续标记,否则网页播放容易花屏音画不同步,同时做好旧分片定时清理。借助网页调试工具模拟推流断连恢复,验证 M3U8 标记与播放表现,处理公网网络抖动带来的直播故障。