You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用GStreamer rtmpsink的直播流中仅为音频添加最高15秒延迟

GStreamer RTMP流单独添加音频延迟的正确方案

之前操作失效的原因

  • 直接加queue阻塞的原因:你配置的queue参数逻辑冲突,min-threshold-time=15000000000要求队列存满15秒数据才向下游推送,但你同时把max-size-time=0,相当于队列允许存储的最大时长为0,根本装不下15秒的音频数据,队列满后直接阻塞上游数据流,导致整个流停摆。
  • 手动改PTS/设置pad offset失效的原因:flvmux默认会自动对齐音视频的时间基线,你单独把音频PTS往后偏移,flvmux会一直等待对应时间戳的视频帧到达才会封装输出,相当于你偏移多少,就会多等多久的视频,自然看不到延迟效果,严重时还会直接阻塞整个流。

方案1:仅用命令行实现(无需改代码)

直接修改音频支路的queue配置即可,正确命令如下:

gst-launch-1.0 -vvv flvmux streamable=true name=mux ! rtmpsink location="rtmp://localhost/live" \
souphttpsrc location="http://<url video h264>" ! tsdemux ! h264parse ! queue ! mux. \
souphttpsrc location="https://<url audio aac>" ! icydemux ! aacparse ! queue max-size-buffers=0 max-size-bytes=0 max-size-time=20000000000 min-threshold-time=15000000000 ! mux.

这里把max-size-time设为20秒(20000000000纳秒),大于你需要的15秒阈值,队列可以正常存够15秒音频后再向下游推送,不会出现阻塞问题。

方案2:C代码实现更稳定的延迟控制

推荐直接使用GStreamer内置的audiodelay元素,不需要手动改时间戳,自动处理缓存和时间同步问题,操作步骤:

  1. 在aacparse和原有queue之间插入audiodelay元素
  2. 设置audiodelay的delay属性为你需要的延迟时长,单位为纳秒,比如10秒对应10000000000,15秒对应15000000000
    示例代码片段:
GstElement *audiodelay = gst_element_factory_make("audiodelay", "audio_delay");
g_object_set(audiodelay, "delay", 15000000000, NULL);
// 按顺序把aacparse、audiodelay、queue、mux连起来即可

如果一定要手动改时间戳实现,需要同时修改PTS和DTS,并且把flvmux的dont-sync属性设为true关闭自动时间对齐,同时给音频支路配置足够大的队列缓存,避免数据丢失。

内容的提问来源于stack exchange,提问作者handozon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:03