RTSP経由でH.264ビデオをストリーミングするのに問題があります。目標は、カメラ画像をRTSPクライアント(理想的にはブラウザプラグイン)にライブストリーミングすることです。これは、1つの問題を除いて、これまでのところかなりうまく機能しています。ビデオは起動時に遅れ、数秒ごとに途切れ、最大4秒の遅延があります。これは悪いです。
私たちのセットアップは、x264(ゼロレイテンシーと超高速)でエンコードし、ffmpeg0.6.5のlibavformatを使用してRTSP/RTPにパックすることです。テストのために、RTSPサーバーに接続するときに、gst-launchを使用したGStreamerパイプラインでストリームを受信しています。ただし、RTPだけを使用して別のGStreamerインスタンスから直接ストリーミングする場合でも、同じ問題を再現することができました。
送信機:
gst-launch videotestsrc ! x264enc tune=zerolatency ! rtph264pay ! udpsink host=10.89.6.3
受信機:
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink
これらの両方を同じマシンで実行することもできます。送信側でホストを127.0.0.1に変更するだけです。受信側では、コンソールに繰り返し警告が表示されるとともに、途切れ途切れで一般的にパフォーマンスの低いビデオに気付くはずです。
WARNING: from element /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0: A lot of buffers are being dropped.
Additional debug info:
gstbasesink.c(2875): gst_base_sink_is_too_late (): /GstPipeline:pipeline0/GstXvImageSink:xvimagesink0:
There may be a timestamping problem, or this computer is too slow.
私がインターネット全体で見た一般的に提案された「修正」の1つはsync=false
、xvimagesinkで使用することです。
gst-launch udpsrc ! application/x-rtp,payload=96 ! rtph264depay ! decodebin ! xvimagesink sync=false
その後、カメラソフトウェアでテストした場合でも、ビデオはほぼゼロの遅延で再生されます。これはテストには役立ちますが、Totem、VLC、またはそれらのブラウザープラグインの埋め込みでは機能しないため、展開にはあまり役立ちません。
ソースで問題を解決しようと思います。x264によるH.264ストリーム、またはおそらくRTPペイロードにある種のタイムスタンプ情報が欠落しているのではないかと疑っています。レシーバーで使用する必要がないようにソースgstパイプラインを変更する方法はありますか?sync=false
それが不可能な場合、ストリームを同期してはならないことをクライアントに(SDPまたはその他の方法で)どのように伝えることができますか?最終的には、ある種のVLCプラグインを使用してこれをブラウザーに埋め込むので、そこで機能するソリューションはさらに優れています。