如何在使用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元素,不需要手动改时间戳,自动处理缓存和时间同步问题,操作步骤:
- 在aacparse和原有queue之间插入audiodelay元素
- 设置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
相关产品推荐
相关产品推荐

