如何在ffmpeg混流过程中调整两路RTMP源的音视频同步延迟
实现动态调整RTMP混流音视频延迟的方案
方案1:基于ZMQ实时发送控制命令(响应最快)
前置要求
确保你的FFmpeg编译时开启了--enable-libzmq参数,同时内置adelay、setpts滤镜,主流发行版的预编译FFmpeg默认已支持。
初始混流命令
ffmpeg -i rtmp://<你的音频RTMP源地址> -i rtmp://<你的视频RTMP源地址> \ -filter_complex "\ [0:a]adelay=delays=0:max_delay=10000:zmq=1[a_out];\ [1:v]setpts='PTS+0/TB:zmq=1'[v_out]" \ -map "[v_out]" -map "[a_out]" \ -c:v libx264 -preset veryfast -c:a aac \ -f flv rtmp://<你的混流输出RTMP地址>
参数说明:
adelay的delays单位为毫秒,max_delay设置最大支持的延迟时长,这里设为10000即10秒setpts的+0为视频的延迟秒数,初始设为0- 末尾的
zmq=1表示开启该滤镜的ZMQ控制能力
动态调整命令
调整时直接通过zmqsend工具发送指令即可实时生效:
- 给音频增加250毫秒延迟:
zmqsend "Parsed_adelay_0 delays 250"
- 给视频增加1.2秒延迟:
zmqsend "Parsed_setpts_1 expr 'PTS+1.2/TB'"
注:滤镜编号按filter_complex中定义的顺序排序,不确定编号可查看FFmpeg启动时的日志输出,搜索Parsed_前缀即可获取对应滤镜的完整标识。
方案2:基于配置文件自动读取(无需额外依赖)
如果不想安装ZMQ相关工具,可以用FFmpeg自带的sendcmd滤镜实现,通过更新本地配置文件触发延迟调整。
初始混流命令
# 先新建空的命令配置文件 touch delay_cmds.txt # 启动FFmpeg ffmpeg -i rtmp://<你的音频RTMP源地址> -i rtmp://<你的视频RTMP源地址> \ -filter_complex "\ sendcmd=f=delay_cmds.txt:c=1,\ [0:a]adelay=delays=0:max_delay=10000[a_out];\ [1:v]setpts='PTS+0/TB'[v_out]" \ -map "[v_out]" -map "[a_out]" \ -c:v libx264 -preset veryfast -c:a aac \ -f flv rtmp://<你的混流输出RTMP地址>
参数说明:sendcmd的c=1表示循环读取配置文件的更新,无需重启FFmpeg。
动态调整操作
需要调整延迟时,直接写入命令到delay_cmds.txt保存即可生效,示例内容:
# 格式:生效时间 滤镜类型 滤镜编号 参数名 参数值 0 adelay 0 delays 300 0 setpts 1 expr PTS+0.7/TB
这里开头的0表示立即生效,写入后FFmpeg会自动读取配置并应用新的延迟参数。
注意事项
- 调整延迟时尽量采用小幅步进的方式,避免音画跳变过于明显影响观看体验
- 仅需要调整单路延迟时,可只给对应流添加延迟滤镜,无需同时配置音频和视频的延迟参数
- 如果需要音频提前于视频,给视频加延迟即可;如果需要视频提前于音频,给音频加延迟即可
内容的提问来源于stack exchange,提问作者Nguyễn Thành Duy
相关产品推荐
相关产品推荐

