ファイルからデータをストリーミングしながら、ライブソースをエミュレートする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フィルタを見つけて作成することにより、キューの前にパイプラインスループットを調整する方法が必要だと考えました。
これを行う方法について何かヒントはありますか?