Streaming 限制gstreamer管道吞吐量以模拟活动源
我正在开发一个RTSP服务器,它应该模拟一个实时源代码,同时从一个文件流式传输数据 我目前拥有的主要是基于示例,只有以下管道:Streaming 限制gstreamer管道吞吐量以模拟活动源,streaming,gstreamer,rtsp,Streaming,Gstreamer,Rtsp,我正在开发一个RTSP服务器,它应该模拟一个实时源代码,同时从一个文件流式传输数据 我目前拥有的主要是基于示例,只有以下管道: gst_rtsp_media_factory_set_launch(factory, "( " "filesrc location=stream.mkv ! matroskademux name=demuxer " "demuxer. ! queue ! rtph264pay name=pay0 pt=96 " "demuxer. ! queue !
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秒的录制时间
我试图通过限制队列大小并将它们设置为泄漏来实现这一点(通过将它们设置为队列最大大小字节=1000000最大大小时间=100000000泄漏=上游
,这将为大约1秒的视频提供缓冲,但不超过1秒)。这并不像我希望的那样完全有效:源和解复用器填满了队列,然后在0.1秒内完全清空了它们自己
我想我需要一些方法来限制队列之前的管道吞吐量,或者将解复用器限制为实时解复用,或者查找/制作一个gstreamer过滤器,该过滤器将允许每1秒的实时数据通过1秒
您有关于如何执行此操作的提示吗?因此,尽管存在泄漏队列和限制器,但它们在这方面没有多大帮助,因为GStreamer RTSP实现有自己的传出TCP数据队列。似乎有效的方法是保持管道不变,并修补gst rtsp服务器模块以限制其队列长度(在本例中为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;