Gstreamer RTSP Server使用tee分支后autovideosink卡住如何排查?
问题原因
核心是GStreamer tee元件的分支未做异步队列隔离,单分支阻塞直接拉垮了整个流水线:
GStreamer tee默认会将输入的buffer同步推送到所有输出分支,只要任意一个分支消费速度不匹配、出现阻塞,就会卡住tee上游的所有数据供给,你碰到的情况就是两个分支运行节奏冲突:
- 走x264编码、rtp打包的RTSP分支,在客户端未完成接入、或者接入后消费速度不足时会进入阻塞状态,此时tee会停止推送数据,本地的autovideosink自然就只能显示第一帧后卡住
- 反过来如果autovideosink因为窗口刷新、显示同步逻辑出现阻塞,也会卡住RTSP流的推送,导致客户端无法拿到SDP信息,最终出现你日志里的「服务端响应超时」报错
修复方案
- 给tee的每个输出分支都加独立的
queue元件做异步隔离,让两个分支的数据流互不影响,修改后的服务端启动串如下:
videotestsrc pattern=ball ! videoconvert ! video/x-raw, width=(int)800, height=(int)800, format=(string)I420 ! tee name=t \ t. ! queue ! x264enc ! rtph264pay name=pay0 pt=96 \ t. ! queue ! autovideosink
- 可选优化:给x264enc添加
tune=zerolatency参数降低编码延迟,给autovideosink添加sync=false参数关闭显示同步,避免同步逻辑导致的不必要阻塞。
内容的提问来源于stack exchange,提问作者NicholasB
相关产品推荐
相关产品推荐

