如何在不中断直播的前提下替换正在运行的ffmpeg推流命令
FFmpeg无中断切换推流命令解决方案
完全可以实现不停播切换推流命令,具体操作方案分三类,可根据你的场景选择:
方案1:RTMP中转实现100%无感知切换(推荐长期使用)
核心是新增一个本地RTMP中转层,避免直接向目标地址推流,切换时不会影响对外输出:
- 提前搭建本地RTMP中转服务,可使用Nginx+rtmp模块实现,配置中转规则:本地接收地址为
rtmp://127.0.0.1/live/transfer,收到流后自动转发到你的目标推流地址rtmp://myoutputlive - 将当前正在运行的旧推流命令调整为推送到本地中转地址:
ffmpeg -stream_loop -1 -i myvideo1 -c:v libx264 -preset ultrafast -c:a copy -f flv rtmp://127.0.0.1/live/transfer - 需要切换场景时,直接启动新的推流命令,同样推送到同一个本地中转地址(注意原命令缺少滤镜参数前缀
-vf,已补上):ffmpeg -stream_loop -1 -i sound -i image.png -vf "drawtext=你的文本配置,drawbox=你的边框配置" -c:v libx264 -preset ultrafast -c:a copy -f flv rtmp://127.0.0.1/live/transfer - 确认新流已经正常输出后,再kill掉旧的ffmpeg进程即可,全程对外直播无任何中断。
方案2:无中转应急切换(适合临时场景)
如果不想额外搭建中转服务,可通过参数对齐+快速启停实现接近无感知的切换:
- 先确保两条推流命令的音视频编码参数完全一致:包括视频的分辨率、帧率、GOP大小、码率,音频的采样率、声道数、码率,避免切换时出现解码异常
- 提前在终端输入好新的推流命令,不要执行
- 手动终止旧ffmpeg进程的瞬间,立刻执行新的推流命令,这种操作只会产生小于1秒的断流,大部分直播平台的前端缓存会掩盖这个间隙,观众基本感知不到
- 注意:该方案存在极小概率出现卡顿、花屏的风险,仅适合临时应急使用
方案3:常驻进程动态切换(适合多场景频繁切换)
如果后续需要频繁切换直播场景,可以直接启动一个常驻FFmpeg进程,将所有需要用到的音视频输入源都预先加载,通过zmq或者stdin指令动态切换输出的输入源,全程不需要启停进程,零断流。
内容的提问来源于stack exchange,提问作者timimi
相关产品推荐
相关产品推荐

