私は、次のパイプラインでgst-rtsp-serverを使用しています:H264ビデオストリームを(私はGStreamerのに全く新しいです)送信するためにのGStreamer H264パイプライン遅れ
gst_rtsp_media_factory_set_launch(factory, "("
"appsrc name=mysrc "
"! videoconvert "
"! videoscale "
"! video/x-raw,format=I420,width=350,height=250 " // fps
"! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true "
"! video/x-h264,profile=baseline "
"! rtph264pay name=pay0 pt=96 mtu=1300 "
")");
。私はプッシュモードで実行しています:
g_object_set(appsrc, "stream-type", GST_APP_STREAM_TYPE_STREAM, NULL);
必要なデータコールバックを介してのみプッシュします。ほとんどすべてが期待どおりに機能しています。サーバーを稼働させると、カメラのストリームは正常に流れますが、ストリームには2秒(約)の遅延があります。
この遅れは、私が使用する設定の組み合わせに関係なく一貫しています。
異なる
- ビットレート
- カメラ解像度4 fpsで実行されている
- :
GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 4);
が30 fpsで実行されている:GST_BUFFER_DURATION(buffer) = gst_util_uint64_scale_int(1, GST_SECOND, 30);
すべてが同じ効果を持っています。それは私の流れがちょうど2秒の遅れを蓄積し、それ以来永久に相殺されているようです。あたかもgstreamerが内部バッファを特定のサイズに蓄積してから、それをブロードキャストし始めたかのように。
gstreamerの私の未熟さのため、私はこれをばらばらにしています。誰かが私を指すヒントやヒントを持っていたら、方向をデバッグを続けると大いに感謝します。
EDIT:完全性については
@peterの方向の後、私は今、小さなバッファのVLCに対応するために、私のパイプラインを変更しなければならなかった、(他のケースでは誰もがこの問題に関連します)。これが「正しい方法」であるかどうかは分かりませんが、それは私のために働いていました。
基本的に私の "プロデューサ"(私のプログラム)を60fpsで生産し、videorate
モジュールを使ってパイプラインでの伝送のために30fpsにスケールアップしました。これにより、VLCに200msのバッファを与えることができました。これが私の新しいパイプラインです。
gst_rtsp_media_factory_set_launch(factory, "("
"appsrc name=mysrc "
"! videoconvert "
"! videoscale "
"! videorate "
"! video/x-raw,format=I420,width=350,height=250,framerate=30/1 " // fps
"! x264enc bitrate=128 speed-preset=ultrafast tune=zerolatency byte-stream=true threads=4 key-int-max=15 intra-refresh=true "
"! video/x-h264,profile=baseline "
"! rtph264pay name=pay0 pt=96 mtu=1300 "
")");
もう一度@peterに感謝します。
@peterピート、あなたは私の友人の男です(そして、私が使っていたレシーバーが実際にVLCだったことを忘れてしまった)、ありがとう。私は数日間、これについて頭を悩ましてきました。私はあなたがタイプしている以上のことをすることができればいいと思う - 涙を流す* - ありがとう! – JDR