レイテンシーの値を最小にしたかったので、さまざまなプレーヤーを使用して複数のライブストリームを再生することをテストしてきました。 gstreamerプレーヤー(gst-launch-0.01)、mplayer、totem、ffmpegプレーヤー(ffplay)を試してみました。たとえば、さまざまな構成値を使用して、それぞれのレイテンシを最小にしました。
ffplay -fflags nobuffer
mplayer -benchmark
私がストリーミングしているプロトコルはudpであり、mplayerやgst-launchよりもffplayの方が良い値を取得しています。正直なところ、レイテンシーを低くするためにgstreamerでどのような構成を行う必要があるのかわかりません。さて、私が必要としているのは2つのことです。
100ミリ秒未満の低遅延でライブストリームをストリーミングすることについて、誰かがより良い提案をしているかどうかを知りたいです。私は今100ミリ秒より高くなっていますが、これは私にとってあまり効率的ではありません。
私は現在ffplayを使用しているので、これまでで最高だからです。再生と録画のボタンと3つの画面を使用して、さまざまなビデオサーバーからストリーミングする簡単なGUIを実行したいのですが、使用するラッパーの種類(非常に高速である必要があります)がわかりません。
まあ、本当に低遅延のストリーミングシナリオでは、NTSCを試すことができます。その待ち時間は、理想的には63us(マイクロ秒)未満にすることができます。
品質がNTSCに近づき、レイテンシーバジェットが40msのデジタルストリーミングについては、120Hzでのrsaxvcの回答を参照してください。OverTheAirストリーミングが必要な場合、これは私が見た中で最高の低レイテンシーオプションです。よく考えられており、解像度はハードウェア機能に応じて拡張されます。
デジタルストリーミングを意味し、優れた圧縮率、つまりWi-Fi経由で1080pが必要な場合、今日のコモディティハードウェアで100ミリ秒未満の遅延が必要な場合は、圧縮アルゴリズムが優れた圧縮率を提供するため、多くのコンテキストが必要です。たとえば、Mpeg1はipbbpbbpbbpbGOP(画像のグループ)配置で12フレームを使用しました。ここで、iは実質的にjpeg静止画である「イントラ」フレーム、apはiフレームとpフレームの間のいくつかの動きをエンコードする予測フレーム、およびbフレームです。予測がうまく機能しなかったいくつかのスポット修正をエンコードします。とにかく、60fpsでも12フレームはまだ200msなので、データをキャプチャするためだけに200ms、次にデータをエンコードするため、次に送信するため、次にデコードするため、そしてオーディオをバッファリングするためにCPUが新しいブロックをDMAメモリ領域に送信している間、サウンドカードのデータが不足することはありません。同時に、送信するには2〜3フレームのビデオをキューに入れる必要があります。デジタルディスプレイでの裂けを防ぐためのビデオディスプレイ。したがって、実際には最低15フレームまたは250ミリ秒に加えて、送信にかかる遅延があります。NTSCはアナログで送信されるため、このような遅延はありません。唯一の「圧縮」は2つの卑劣なトリックです:各フレームの半分だけが交互の行として毎回送信されるインターレース、1つのフレームでも奇数、次のフレームでは奇数、2番目のトリックは3つの黒と3つの黒を使用した色空間圧縮です白いピクセルと、表示される色を決定するための位相弁別により、色は帯域の3分の1で送信されます明るさ(ルマ)信号の幅。かっこいい?そして、オーディオには一種の「圧縮」があると言えるでしょう。自動ゲイン制御を使用して、20dBのアナログオーディオ信号を使用して、耳を頭から吹き飛ばして60dBに近い体験を提供できるようにすることができます。ショーとコマーシャルの間の2〜3秒間の無音の間に、AGCが音量を上げたことによるコマーシャル。後で私たちがより忠実なオーディオ回路を手に入れたとき、コマーシャルは実際にはショーよりも大きな音で放送されましたが、それは古いテレビが広告主に与えたのと同じ影響を与える方法でした。
ノスタルジア(tm)によってもたらされたこのウォークダウンメモリーレーン。ノスタルジアブランドのトイレ用石鹸を購入! ;-)
これは、Ubuntu18.04でストックffmpeg
とmpv
を使用して達成した最高のものです。これには、第3世代IntelCoreプロセッサ以降が必要です。代わりにNVidiaハードウェアコーディングを使用する方法については、ffmpegサイトを参照してください。
ffmpeg -f x11grab -s 1920x1080 -framerate 60 -i :0.0 \
-vaapi_device /dev/dri/renderD128 \
-vf 'format=nv12,hwupload,scale_vaapi=w=1920:h=1080' \
-c:v h264_vaapi -qp:v 26 -bf 0 -tune zerolatency -f mpegts \
udp://192.168.1.201:12345
そして、メディアボックスで:
mpv --no-cache --untimed --no-demuxer-thread --video-sync=audio \
--vd-lavc-threads=1 udp://192.168.1.201:12345
これにより、約3Mbpsで1080p @ 60hzの約250msの遅延が達成されます。これは、wifiを介した番組のストリーミングには問題ありません。 mpv
はリップシンクを調整できます(再生中はCTRL +-)。メディア制御のためのデスクトップマウス/キーボードインタラクションのストリーミングには許容できますが、リアルタイムゲームには使用できません(リモートゲームについては、NVidia Shield、Google Stadiaを参照してください)。
VLC、ffmpeg、そしてある程度はmplayerのような従来のメディアプレーヤーの問題は、それらが一貫したフレームレートで再生しようとすることであり、これにはある程度のバッファリングが必要であり、レイテンシーターゲットを殺します。別の方法は、着信ビデオをできるだけ速くレンダリングし、他に何も気にしないことです。
@ genpfault そして私は カスタムUDPプロトコル を作成しました。これはRCカーとクワッドの飛行用に計画されています。これは、他のほとんどすべて(解像度、ビットレート、パケットレート、圧縮効率)を犠牲にして、低遅延を目標としています。より小さな解像度では、115200ボーUARTおよびXBEEを超えて実行するようになりましたが、これらの制限の下でのビデオは、期待したほど有用ではありませんでした。今日、320x240構成でテストしています。元のセットアップがなくなったため、ラップトップ(Intel i5-2540M)で実行しています。
レイテンシーの予算を計画する必要があります。これが私が費やした場所です。
合計は40.2mSになります。
エンコーディング:
当時、X264は私たちが見つけた中で最高のH264-AnnexBエンコーダーでした。ビットレート、slice-max-size、vbv-bufsize、vbv-maxrateを制御する必要がありました。 「超高速」と「zerolatency」のデフォルトから始めます。これにより、Bフレームが無効になります。
さらに、フレーム内の更新は必須です!これにより、通常の「I」フレームを切り刻み、次のPフレームと組み合わせることができます。これがないと、ビットレートの需要に「バブル」が発生し、一時的にトランスポートが詰まり、レイテンシが増加します。
エンコーディング-輸送-計画:
エンコーダーは、UDPサイズのH264NALUを生成するように調整されました。このように、UDPパケットがドロップされると、H264 NALU全体がドロップされ、再同期する必要はありませんでした。デコーダーは一種の...バースト...であり、グラフィックの破損が続きました。
最終結果320x240
それは...私のラップトップに向けられたカメラに向けられた携帯電話で確実に測定できるよりも速いです。圧縮率320x240x2B = 150kB /フレーム、3kB /フレーム強に圧縮されています。