5

ファイルからデータをストリーミングしながら、ライブソースをエミュレートする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 "
")");

これは、1つの問題を除いて非常にうまく機能します。RTSPクライアント(RTSP / TCPインターリーブトランスポートを使用)がデータを受信できない場合、クライアントが再び準備ができるまでパイプライン全体がロックされ、ジャンプ。

ビデオを無期限にバッファリングできないライブソースをエミュレートしたいので、この場合の望ましい動作はファイルの再生を継続することです。したがって、クライアントが5秒間ブロックすると、5秒間の記録が失われます。

キューのサイズを制限し、リークとして設定することでこれを達成しようとしました(に設定するとqueue max-size-bytes=1000000 max-size-time=1000000000 leaky=upstream、ビデオの最大1秒にバッファが提供されますが、それ以上は提供されません)。これは私が期待したように完全には機能しませんでした。ソースとデマルチプレクサがキューをいっぱいにし、0.1秒で完全に空になりました。

デマルチプレクサをリアルタイムのデマックスに制限するか、リアルタイムの1秒あたり1秒のデータを通過させるgstreamerフィルタを見つけて作成することにより、キューの前にパイプラインスループットを調整する方法が必要だと考えました。

これを行う方法について何かヒントはありますか?

4

1 に答える 1

0

そのため、漏れのあるキューとリミッターを実行できますが、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;
于 2012-06-08T12:58:50.133 に答える