首页 > 解决方案 > 如何为 RTSP 服务器添加缓冲区?

问题描述

我正在尝试创建以下管道:

在杰特森上

1.1) 摄像头 -> ... -> udpsink 1.2) udpsrc -> rtspserver

在主机 PC 上

2.1) rtspsrc -> jitterbuffer -> 检测 -> 跟踪器 -> 分析

主要问题是 My Jetson通过本地 WiFi 网络连接到主机 PC 。我选择了网状 WiFi Tenda Nova MW3。当Jetson从一个 WiFi 接入点重新连接到另一个时,我丢失了一些帧(从 0.5 到 10 秒的流)。我了解我们无法获得理想的无缝 WiFi 网络,并且系统在重新连接期间会“丢失一些帧”。

我尝试在 udpsrc 和 udpsink 上设置缓冲区,我尝试在 rtspsrc 上设置 do-retransmission,但它不起作用,或者可能是我做错了。

  1. 如何在 RTSP 服务器中设置缓冲区以在Jetson客户端重新连接到另一个 WiFi 点并继续从最后一个点向主机 PC发送帧时保留帧?
  2. 我应该在 udpsink 或 udpsrc 或 rtspserver 上设置缓冲区吗?
  3. 如何配置 rtpsrc 以从“丢失的时间”发送帧?

标签: gstreamerpython-gstreamer

解决方案


我丢失了一些帧(从 0.5 到 10 秒的流)

可能是因为 Host pipeline 中的解码器错过了 I 帧,应该等待下一个 I 帧,0.5~10s 取决于 GOP 中的第一帧位置(GOP 可以通过编码器属性更改)。

  1. 你可以使用rtmp服务器代替rtsp,srs是一个不错的选择,并且打开gop缓存。管道想成为相机 -> 编码器 -> flvmux -> rtmpsink

     vhost __defaultVhost__ {
         gop_cache       on;
     }
    
  2. 开启gop缓存时延迟会增加,所以encoder的GOP不要那么大,可能2s就好了。

  3. 主机 pc 上的管道可能会接收在重新连接 wifi 之前已处理的视频数据,与禁用 gop 相比,延迟也更大。如果其中任何一个很重要,您应该在解码后丢弃过时的帧。


推荐阅读