You need to enable JavaScript to run this app. 如何在ffmpeg混流过程中调整两路RTMP源的音视频同步延迟
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:36:10