web-dev-qa-db-ja.com

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

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

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

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

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
#

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

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

  • 100msのレイテンシーに到達します。
  • mplayerが実行されると、リアストリームをシークできないと文句を言い、オーディオなしがあります。出力をファイルに保存して再生しても、まだ音が出ます。

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

  • エンコーディングがcpuコアの1つを100%使用しないのであれば素晴らしいでしょう(第2の目標)。

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

3
Kru

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

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

これらが有用な答えであるかどうかはわかりませんが、おそらくもっと有用な何かにつながるのでしょうか?

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

0
TheFu