2012-06-06 37 views
4

我正在开发一个RTSP服务器,它应该模拟一个活动源,同时从一个文件流式传输数据。限制gstreamer管道吞吐量来模拟活动源

我现在已经大多基于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秒内完全清空。

我想我需要某种方法来限制队列之前的管道吞吐量,要么通过将分流器限制为实时解复用,要么寻找/制作gstreamer过滤器,以实现每秒1秒的实时数据。

你有任何提示如何做到这一点?

回答

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;