断开网线后GStreamer RTSP管道释放阻塞,如何缩短READY到NULL切换时间?
解决GStreamer RTSP流断网后unref阻塞30秒的问题
从你提供的日志能明确看到阻塞根源:断开网线后调用unref释放管道时,rtspsrc会尝试发送TEARDOWN请求优雅关闭RTSP会话,但网络中断导致请求无法送达服务器,最终卡在TCP默认重传超时(约30秒)的等待过程中(日志里从0:00:35发送TEARDOWN到0:01:06才完成超时,刚好对应这个时长)。
针对GStreamer 1.16.2版本,你可以尝试以下几种方案缩短阻塞时间:
1. 关闭TEARDOWN请求发送(最直接有效)
rtspsrc提供了send-teardown属性,设置为false后,关闭管道时不会发送TEARDOWN请求,直接断开连接释放资源,完全规避等待响应的过程。修改你的管道:
gst-launch-1.0 rtspsrc location="rtsp://192.168.82.51:554/axis-media/media.amp?videocodec=h264" latency=150 drop-on-latency=true tcp-timeout=50000 timeout=200000 teardown-timeout=10000000 do-retransmission=false send-teardown=false ! decodebin ! videoconvert ! autovideosink
如果是代码中调用,对应设置:
g_object_set(GST_ELEMENT(rtsp_src), "send-teardown", FALSE, NULL);
2. 优化超时参数+主动触发关闭(适合需保留TEARDOWN的场景)
如果必须发送TEARDOWN请求(比如需要服务器立即释放会话资源),可以尝试:
- 缩短
teardown-timeout参数(单位为微秒,比如设为5000000即5秒) - 在调用
gst_element_set_state(pipeline, GST_STATE_NULL)前,主动调用gst_rtspsrc_close()方法触发会话关闭,配合超时参数减少等待时长
不过这个方法在1.16.2版本中可能受底层TCP超时限制,效果不如第一种方案显著。
3. 升级GStreamer版本(长期解决方案)
GStreamer 1.16.2是2019年的老旧版本,后续1.20及以上版本对rtspsrc的网络异常处理做了优化,包括更精准的超时控制和更快的资源释放逻辑。如果环境允许,升级到新版本大概率能彻底解决这个阻塞问题。
额外注意:释放管道前,建议先显式调用gst_element_set_state(pipeline, GST_STATE_NULL),并通过gst_element_get_state()等待状态切换完成(返回GST_STATE_CHANGE_SUCCESS),再调用gst_object_unref(),确保资源被正确清理。
内容的提问来源于stack exchange,提问作者BЈовић
相关产品推荐
相关产品推荐

