为什么GStreamer中tee元件搭配udpsrc使用时流水线会发生卡顿?
问题原因
- 首先是你编写的带tee的udpsrc流水线存在语法错误:
tee name=t之后直接拼接queue,缺少GStreamer流水线元素间必须的链接符号!,导致tee的输出没有正确链接到第一个分支的队列元素,整个数据流链路断裂,无法正常运行。 - 次要的性能风险:你当前的设计是在tee的两个分支分别执行H264解码操作,同一份流重复解码会额外占用CPU资源,低配置设备上可能会出现性能不足导致的卡顿。
修复方案
1. 语法修正版(保留原有分支解码逻辑)
gst-launch-1.0 udpsrc port=5600 do-timestamp=true ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264 ! queue ! rtph264depay ! h264parse ! tee name=t ! queue ! avdec_h264 ! autovideosink t. ! queue ! avdec_h264 ! autovideosink
2. 性能优化版(解码前置,仅做一次解码)
将解码操作放在tee之前, tee直接分发解码后的原始视频帧到两个渲染分支,降低CPU消耗:
gst-launch-1.0 udpsrc port=5600 do-timestamp=true ! application/x-rtp,media=video,clock-rate=90000,encoding-name=H264 ! queue ! rtph264depay ! h264parse ! avdec_h264 ! tee name=t ! queue ! autovideosink t. ! queue ! autovideosink
额外适配建议
如果修正语法后仍偶现卡顿,可以调整每个分支queue的缓存阈值,避免队列满阻塞上游数据流:
将分支的queue替换为queue max-size-buffers=0 max-size-time=0 max-size-bytes=0即可。
内容的提问来源于stack exchange,提问作者Clyde McQueen
相关产品推荐
相关产品推荐

