ffmpeg を使用した低遅延ストリーミング

ffmpeg を使用した低遅延ストリーミング

最近、リモートデスクトップをストリーミングしようとしていますffmpeg目標は、出力解像度などの設定を選択しながら、コンピューターの画面に表示されている内容を別のコンピューターに送信できるようにすることです。

それは小さいほぼ機能している概念実証。完了したら、VNCを次のように置き換えることができます。ffmpegストリーミング2倍またはシナジーキーボードとマウスのイベントを転送します。

これで、以下を使用してストリーミングを開始できます。

ffmpeg -f x11grab -s "1600x1200" -i ":0" \
    -f alsa -i pulse \
    -s 800x600 -b 200k -f mpegts - \
    | mplayer -cache 1024 -
#
# I have pulse audio configured so that `-i pulse` will
# The output can sent through for example netcat to another host
#

遅延はエンコード オプションによって異なります。これらのオプションを使用すると、画面の更新とビデオの更新の間の遅延は約 800 ミリ秒になります。

私が達成しようとしていること:

  • レイテンシに達する100ミリ秒
  • 実行されるとmplayer、リーアストリームで検索できないと文句を言い、音声なし出力をファイルに保存して再生すると、まだ音が聞こえます。

    編集: を追加した後-cache、リニア ストリームでシークするメッセージは表示されなくなりました。出力形式を に変更すると、-f mpegtsオーディオが機能するようになります。

  • エンコードが CPU コアの 1 つを 100% 使用しないのが理想です (二次目標)。

インターネットで少し調べたところ、これらの問題は使用すべきコーデック/オプションに関連していると思います。しかし、既存の可能性の違いがわかりません。私の問題を解決できるオプションをいくつか教えていただけますか? また、VLC は良い代替手段でしょうか? もしそうなら、あるデスクトップから別のデスクトップにストリーミングするための同等のコマンドは何でしょうか?

答え1

デスクトップ A からデスクトップ B へのストリーミングは興味深い問題です。ビデオ/オーディオが必要ない場合は、代わりに NX プロトコルを調べるとよいでしょう。VNC よりもはるかに効率的です。FreeNX はサーバーであり、NoMachine などが NX クライアントを作成します。他にも無料のサーバーや商用サーバーがあります。

また、高性能リモート デスクトップ、SPICE、機能に関する作業も F/LOSS プロジェクトとして実行されています。Redhat が主導権を握っていると思います。http://spice-space.org/

これらが役に立つ回答かどうかはわかりませんが、もっと役に立つ何かへの手がかりになるかもしれません。

ストリーミング ビデオの場合、完全なデスクトップ プロトコルのオーバーヘッドを回避する必要がある可能性があります。

答え2

最近、元の投稿者 (OP) よりもさらに厳しい要件で低遅延ストリーミングを設定する必要がありました。マウスとキーボードの入力がスムーズで、ラップトップの追加モニターとして十分に機能するソリューションを考案しました。

送信側では、次のffmpegコマンドを使用しました。

ffmpeg -video_size 1920x1080 -r 30 -framerate 30 -f x11grab -i :0.0+0x0 \
    -b:v 40M -maxrate 50M -bufsize 200M \
    -field_order tt -fflags nobuffer -threads 1 \
    -vcodec mpeg4 -g 100 -r 30 -bf 0 -mbd bits -flags +aic+mv4+low_delay \
    -thread_type slice -slices 1 -level 32 -strict experimental -f_strict experimental \
    -syncpoints none -f nut "tcp://10.0.0.1:1234"

このコマンドの重要な部分は -g 100 引数です。これにより、キーフレーム間に時間が追加され、ストリームのビットレートが下がります。

受信側では、ffplay(に付属ffmpeg) を使用して、Raspberry Pi 3 にストリームを表示しました。

ffplay -autoexit -flags low_delay -framedrop -strict experimental \
    -vf setpts=0 -tcp_nodelay 1 "tcp://10.0.0.1:1234\?listen"

元の質問が 10 年以上前のものであり、平均的なユーザーが利用できる処理能力がそれ以来大幅に向上していることは承知していますが、これらの 2 つのコマンドは、ローエンドのハードウェアであっても、ローカル ネットワーク経由で低遅延のストリームを設定しようとしている人にとって適切な出発点となります。

関連情報