无法构建含tee、appsink与filesink的GStreamer管道问题求助
问题描述
使用环境
- Jetson Orin Nano
- Jetpack 5.1.2
- L4T 35.4.1
- Ubuntu 20.04
目标管道
想要构建如下GStreamer管道:video source → tee t.→ video sinkt.-> 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
解决方案
这个问题是管道数据流不平衡导致的,两个分支处理速度差异过大,慢分支阻塞后会引发快分支队列空转,可通过以下方式调整:
- 给队列添加适配属性
给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
- 用硬件加速替代软件编码
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
- 调整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
相关产品推荐
相关产品推荐

