簡體   English   中英

限制gstreamer管道吞吐量以模擬實時源

[英]Limiting gstreamer pipeline throughput to simulate live source

我正在開發一個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過濾器。

你有任何關於如何做到這一點的提示嗎?

因此,雖然可以完成泄漏隊列和限制器,但它們在這方面沒有多大幫助,因為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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM