che*_*che 5 streaming rtsp gstreamer
我正在开发一种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 "
")");
Run Code Online (Sandbox Code Playgroud)
除一个问题外,此方法效果很好:当RTSP客户端(使用RTSP / TCP交错传输)无法接收数据时,整个管道将锁定,直到客户端再次准备好,然后恢复到原始位置而不会任何跳跃。
由于我想模拟无法无限期缓冲其视频的实时源,因此在这种情况下,所需的行为是继续播放文件,因此当客户端阻塞5秒钟时,它将损失5秒钟的录制时间。
我试图通过限制队列大小并将其设置为泄漏(通过将其设置为)来实现此目的(通过将设置为queue max-size-bytes=1000000 max-size-time=1000000000 leaky=upstream
,这应该为大约1秒的视频提供缓冲,但不再提供)。这并没有完全按照我希望的那样工作:信号源和多路分解器填满了队列,然后在0.1秒内将其完全清空。
我认为我需要某种方法来限制队列之前的管道吞吐量,方法是将解复用器限制为实时解复用,或者找到/制作一个gstreamer过滤器,以使每1秒钟的实时数据通过1秒钟。
您对此有任何提示吗?
因此,看起来虽然可以完成泄漏队列和限制器,但它们在这方面没有多大帮助,因为 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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1675 次 |
最近记录: |