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

无法构建含tee、appsink与filesink的GStreamer管道问题求助

问题描述

使用环境

  • Jetson Orin Nano
  • Jetpack 5.1.2
  • L4T 35.4.1
  • Ubuntu 20.04

目标管道

想要构建如下GStreamer管道:
video source → tee t.→ video sink
t.-> appsink

单独运行情况

仅连接一个接收器的管道(即使包含tee)均可正常运行:

TEE videotestsrc - filesink

gst-launch-1.0 videotestsrc ! tee name=t ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! nvvidconv ! 'video/x-raw, format=(string)NV12' ! x264enc speed-preset=fast ! h264parse ! qtmux ! filesink location=demoVideos/videotestsrc.mov -e

TEE videotestsrc - appsink

gst-launch-1.0 videotestsrc ! tee name=t ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! appsink -e

问题场景

同时将两个接收器连接到tee时,设置GST_DEBUG=3,queue_dataflow:5会报错:queue_dataflow gstqueue.c:1516:gst_queue_loop: queue is empty

出错的管道

gst-launch-1.0 videotestsrc ! tee name=t ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! nvvidconv ! 'video/x-raw, format=(string)NV12' ! x264enc speed-preset=fast ! h264parse ! qtmux ! filesink location=demoVideos/videotestsrc.mov t. ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! appsink -e

已尝试的方法

  • 设置appsink的drop=true
  • 增大queue的max-size-buffer
  • 用fakesink替代appsink

解决方案

这个问题是管道数据流不平衡导致的,两个分支处理速度差异过大,慢分支阻塞后会引发快分支队列空转,可通过以下方式调整:

  1. 给队列添加适配属性
    给filesink分支的队列设置leaky=downstream丢弃旧数据避免阻塞,同时给appsink分支关闭同步、保留丢帧设置,让数据流更顺畅:
gst-launch-1.0 videotestsrc ! tee name=t ! \
queue leaky=downstream max-size-buffers=10 ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! nvvidconv ! 'video/x-raw, format=(string)NV12' ! x264enc speed-preset=fast ! h264parse ! qtmux ! filesink location=demoVideos/videotestsrc.mov t. ! \
queue max-size-buffers=20 ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! appsink drop=true sync=false -e
  1. 用硬件加速替代软件编码
    Jetson平台优先用nvv4l2h264enc硬件编码器替代x264enc,同时简化格式转换步骤,减少处理开销:
gst-launch-1.0 videotestsrc ! tee name=t ! \
queue leaky=downstream ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)NV12' ! nvv4l2h264enc preset-level=1 ! h264parse ! qtmux ! filesink location=demoVideos/videotestsrc.mov t. ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! appsink drop=true sync=false -e
  1. 调整tee的调度模式
    给tee设置schedule=0启用pull模式,让每个分支按需拉取数据,平衡两个分支的处理速度:
gst-launch-1.0 videotestsrc ! tee name=t schedule=0 ! \
queue ! nvvidconv ! 'video/x-raw(memory:NVMM), format=(string)NV12' ! nvv4l2h264enc preset-level=1 ! h264parse ! qtmux ! filesink location=demoVideos/videotestsrc.mov t. ! \
queue ! nvvidconv ! 'video/x-raw, format=(string)RGBA' ! appsink drop=true sync=false -e

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:52:40