限制gstreamer管道吞吐量以模拟实时源

时间:2012-06-06 20:02:19

标签: streaming gstreamer rtsp

我正在开发一个应该模拟实时源的RTSP服务器,同时从文件中传输数据。

我目前拥有的内容主要基于gst-rtsp-server示例test-readme.c,只有以下管道:

gst_rtsp_media_factory_set_launch(factory, "( "
   "filesrc location=stream.mkv ! matroskademux name=demuxer "
   "demuxer. ! queue ! rtph264pay name=pay0 pt=96 "
   "demuxer. ! queue ! rtpmp4gpay name=pay1 pt=97 "
")");

这很有效,除了一个问题:当RTSP客户端(使用RTSP / TCP交错传输)无法接收数据时,整个管道将锁定,直到客户端再次准备就绪,然后在原始位置没有任何跳跃。

由于我想模拟无法无限期缓冲其视频的实时源,因此在这种情况下所需的行为是继续播放该文件,因此当客户端阻塞5秒时,它将失去5秒的录制时间。

我试图通过限制队列大小并将它们设置为泄漏来实现这一点(通过将它们设置为queue max-size-bytes=1000000 max-size-time=1000000000 leaky=upstream,这应该提供约1秒视频的缓冲区,但不会更多)。这完全不像我希望的那样:源和解复器填满队列,然后在0.1秒内完全清空。

我认为我需要一些方法来限制队列之前的流水线吞吐量,或者通过将解复用器限制为实时解复用,或者找到/制作一个每1秒实时通过1秒数据的gstreamer过滤器。

您对如何做到有任何提示吗?

1 个答案:

答案 0 :(得分:0)

因此,当泄漏队列和限制器can be done时,它们在这方面没有多大帮助,因为GStreamer RTSP实现有自己的传出TCP数据队列。似乎有用的是保持管道不变并修补gst-rtsp-server模块以限制其队列长度(在这种情况下为1 MB,最近版本也将消息计数限制为100):

--- gst-rtsp-server-1.4.5/gst/rtsp-server/rtsp-client.c 2014-11-06 11:20:28.000000000 +0100
+++ gst-rtsp-server-1.4.5-r1/gst/rtsp-server/rtsp-client.c      2015-04-28 14:25:14.207888281 +0200
@@ -3435,11 +3435,11 @@
   gst_rtsp_client_set_send_func (client, do_send_message, priv->watch,
       (GDestroyNotify) gst_rtsp_watch_unref);

   /* FIXME make this configurable. We don't want to do this yet because it will
    * be superceeded by a cache object later */
-  gst_rtsp_watch_set_send_backlog (priv->watch, 0, 100);
+  gst_rtsp_watch_set_send_backlog (priv->watch, 1000000, 100);

   GST_INFO ("client %p: attaching to context %p", client, context);
   res = gst_rtsp_watch_attach (priv->watch, context);

   return res;