Linux:ネットワーク上のデスクトップビデオキャプチャを画面化し、VNCフレームレート

StackOverflow https://stackoverflow.com/questions/4292535

質問

テキストの壁でごめんなさい-TL; DR:

  • VNC接続のフレームレート(フレーム/秒)とは何ですか?または、むしろ、クライアントまたはサーバーを決定する人は何ですか?
  • デスクトップスクリーンキャプチャに関する他の提案 - しかし、「正しくタイムコード化された」/不快なフレームレート(安定した期間付き)。そして、非圧縮(またはロスレス)画像シーケンスとしてそれを取得する可能性がありますか?

簡単に言えば - 私は私が直面している典型的な問題を抱えています:私は時々ハードウェアを開発し、示すビデオを録音したい 両方とも PCに入力されたコマンド(「デスクトップキャプチャ」)、 ハードウェアの応答(「ライブビデオ」)。特定の詳細に到達する前に、イントロの塊が続きます。
 

イントロ/コンテキスト

私の戦略は、今のところ、ビデオカメラを使用してハードウェアテストのプロセスを記録することです(「ライブ」ビデオとして) - デスクトップキャプチャを同時に行います。ビデオカメラは29.97(30)FPS MPEG-2 .AVIビデオを生成します。また、ビデオと同じフレームレートでPNGの画像シーケンスとしてデスクトップキャプチャを取得したいと思います。その場合、アイデアは次のとおりです。2つのビデオのフレームレートが同じである場合。それから私は簡単にできました

  • デスクトップキャプチャの開始時間を「ライブ」ビデオのマッチングポイントに合わせます
  • セットアップa 絵の絵, 、デスクトップキャプチャのスケーリングされたバージョンが「ライブ」ビデオの上に置かれている -
    • (「ライブ」ビデオの画面の一部が、「デスクトップキャプチャ」オーバーレイを備えた視覚同期ソースとして機能します)
  • インターネット用に適切に圧縮された「ファイナル」組み合わせビデオをエクスポートする

原則として、私は次のようなコマンドラインツールを使用できると思います ffmpeg このプロセスのために。ただし、2つのビデオのアライメント開始点を見つけるためにGUIを使用したいと思います。

最終的に、私が達成したいのは、「最終的な」ビデオをエクスポートするときに最大の品質を維持することです。「ライブ」ビデオは、カメラから外出するときにすでに圧縮されています。これが、オリジナルのビデオを保持し、コマンドラインのようなものを使用して、別の圧縮/解像度が必要な場合に「最終的な」ビデオを新たに生成したい理由です。これがまた、PNGシーケンスとして「デスクトップキャプチャ」ビデオを持ちたい理由でもあります(非圧縮形式はどんなものでもそうだと思いますが):デスクトップを「調整」するための措置を講じるため、勾配は多くなく、ロスレスエンコードはありません。 (すなわち、PNG)が適切です。
 

デスクトップキャプチャオプション

さて、このプロセスにはUbuntu Lucidの下で多くの問題があります(私が現在使用しています)そして、あなたは私の試練のいくつかについて読むことができます 10.04:Theora OGVを使用したビデオオーバーレイ/コンポジット編集-Ubuntuフォーラム)。ただし、重要な問題の1つは、2つの着信ビデオのフレームレートが等しいという仮定です。実際には、通常、デスクトップキャプチャはフレームレートが低いということです。さらに悪いことに、非常に頻繁にフレームがあります 同期していません.

これには、ビデオエディターの前に座って、フレームレベルでの秒以下のクリップを手動で切断して編集する手間が必要です。 時間 最終的には5のための仕事 ビデオ。一方、2つのビデオ(「ライブ」と「キャプチャ」)の場合 やりました 同じフレームレートと同期を持っている:原則として、ビデオエディターで開始同期ポイントを見つけるのに数分以上は必要ありません。 。そのため、この投稿では、 デスクトップキャプチャ 部。

私が見る限り、少数しかありません 実行可能 (とは対照的に Linuxデスクトップをスクリーンキャストする5つの方法)Linux / ubuntuのデスクトップキャプチャの代替品(注、通常、デスクトップキャプチャのターゲットとしてラップトップを使用しています):

  1. ターゲットPC(ラップトップ)をVGA出力のデスクトップをクローンにします。 VGAからコンポジットまたはVGAからS-S-Videoのハードウェアを使用して、VGAからビデオ信号を取得します。別のPCでビデオキャプチャカードを使用してビデオを入手する
  2. 使用する RecordMyDeskTop ターゲットPCで
  3. セットアップa VNCサーバー (viいいえ ubuntuで;また vncserver)キャプチャされるターゲットPCで。 VNC Captureソフトウェアを使用します(など vncrec)VNCストリームをつかむ/記録するための別のPCで(その後、ビデオに変換できます).
  4. 使用する ffmpegx11grab オプション
  5. *(ターゲットPCでいくつかのツールを使用してください。 DMA デスクトップ画像フレームの直接転送 - グラフィックカードフレームバッファメモリからネットワークアダプターメモリへ)

上記のアプローチの有用性は、私の使用のコンテキストによって制限されていることに注意してください。私がキャプチャしたいターゲットPCは、通常、大量のデータの周りを移動するソフトウェア(テスト済みハードウェアを利用)を実行します。このようなシステムを説明することについて言えることは、「かろうじて安定している」ことです:)これは、厳しいゲームのビデオキャプチャを取得したいときにゲーマーが直面する問題に似ていると思います。そして、私がようなものを使い始めたらすぐに recordMyDesktop, また、かなりのリソースを使用しており、ローカルハードディスクでキャプチャしたいと考えています。すぐに重度のカーネルクラッシュが発生します(多くの場合、VMCoreが生成されません)。

だから、私の文脈では、私は通常 2番目 コンピューター - 「ターゲット」PCデスクトップのキャプチャと記録を実行します。それ以外は、上記のオプションでこれまでに見ることができる長所と短所を以下に含めます。

(デスクトップの準備)

以下で説明するすべての方法について、事前にデスクトップを「準備」する傾向があります。

  • デスクトップの背景とアイコンを削除します
  • システム/設定/モニターを介して解像度を800x600に設定します(gnome-desktop-properties)
  • 色の深さを変更します 16 BPPまで(使用しています xdpyinfo | grep "of root" チェックする)

...デスクトップキャプチャソフトウェアの負荷を最小限に抑えるため。 Ubuntuの色の深さを変更するには、xorg.confの変更が必要であることに注意してください。でも、 "xorg.conf(is)は /etc /x11にあります(ubuntu 10.04)「 - だからあなたは実行する必要があるかもしれません sudo Xorg -configure 最初。

グラフィックリソースの使用を低く保つために、私も通常持っていました compiz 無効 - または、むしろ、「システム/設定/外観/視覚効果」が「なし」に設定されています。しかし、私が有効化を試みた後 compiz 「視覚効果」を「通常」に設定することにより(どれの 保存されません)、LCD画面のWindowsがはるかに速く再描画されていることに気付くことができます。だから、デスクトップキャプチャ用にもこのように保ちます。私はこれを少し奇妙だと思います:どうすればよいですか もっと 効果はaを引き起こします もっと早く 画面更新?独自のドライバーによるものではないように見えます(カードはそうです」Intel Corporation N10ファミリー統合グラフィックスコントローラー「、スイッチ時にUbuntuによって独自のドライバーオプションが与えられていません compiz) - しかし、それはすべてのぼやけと効果が私の目をだましているだけかもしれません:))。

クローニングVGA

まあ、これは最も高価なオプションです(1つだけでなく、2つのハードウェアを追加購入する必要があるため、VGAコンバーターとビデオキャプチャカードが必要です)。主にラップトップ(画面と追加のVGA出力の両方がある - デスクトップの場合、追加のグラフィックカード、またはVGAクローニングハードウェアに投資する必要がある場合もあります)。

ただし、ターゲットPCの追加ソフトウェアを必要としない唯一のオプションでもあります(したがって、ターゲットCPUの0%の処理能力を使用します) - また、ビデオを提供する唯一のオプションでもあります。 本当です, 、30 fpsの未成年者のフレームレート(個別のハードウェアによって実行されるため、個々のハードウェアピースの間に存在するクロックドメインの不整列が存在するという仮定は無視できます)。

実際、私はすでにキャプチャカードのようなものを所有しているので、私はすでにVGAコンバーターに投資しています - 最終的には最終的な「マージされた」ビデオを5分間のアライメントポイントと単一のコマンドを探していることを期待して期待していますライン;しかし、このプロセスが意図したとおりに機能するかどうかはまだわかりません。また、非圧縮ビデオ @ 800x600、30 fpsとしてデスクトップをキャプチャすることがどれほど可能かをさまようこともさまようことです。

RecordMyDeskTop

まあ、あなたが走るなら recordMyDesktop 引数がなければ - それは最初に、生の画像データをキャプチャすることから始まります。 /tmp/rMD-session-7247;また、CTRL-Cを押して中断すると、この生の画像データを.ogvにエンコードします。明らかに、私のテストソフトウェア(これも大量のデータを移動する)と同じハードディスクで大きな画像データをつかむことは、通常Instacrashの原因です:)

したがって、私がやろうとしたことはそうです Sambaをセットアップします ネットワーク上のドライブを共有する。その後、ターゲットPCで、私はこのドライブに接続し、指示します recordMyDesktop このネットワークドライブを使用するには(via GVFS)一時的なファイルとしての場所:

recordmydesktop --workdir /home/user/.gvfs/test\ on\ 192.168.1.100/capture/ --no-sound --quick-subsampling --fps 30 --overwrite -o capture.ogv 

このコマンドは、一時ファイルにネットワークの場所を使用することに注意してください(したがって、それが可能になります recordMyDesktop 私のソフトウェアと並行して実行するには) - CTRL -Cにヒットするとすぐに、エンコードと保存を開始します capture.ogv ターゲットのローカルハードドライブに直接(ただし、その時点では、私は本当に気にしません:))

私のナグの最初 recordMyDesktop 一時的なファイルを保持するように指示することができず、最後にエンコードを避けることはできません。CTRL+ALT+Pを一時停止に使用できます。または、最初のものをすぐにctrl -Cを押してクラッシュさせることができます。その後、一時ファイルが残ります(2回目にCTRL-Cを十分に迅速にヒットしないと、プログラムは「キャッシュをクリーンアップします...」)。その後、実行できます。

recordmydesktop --rescue /home/user/.gvfs/test\ on\ 192.168.1.100/capture/rMD-session-7247/

...生の一時データを変換するため。しかし、多くの場合、 recordMyDesktop この「救助」を行う最中に、それ自体がセグフォールトを断ち切るでしょう。しかし、私が一時ファイルを保持したい理由は、絵の絵のモンタージュの非圧縮ソースを持つことです。 」に注意してください--on-the-fly-encoding「温度ファイルの使用を完全に避けます - より多くのCPU処理能力を使用するという費用がかかります(私にとっては、再びクラッシュの原因です。)

それから、フレームレートがあります - 明らかに、あなたは設定できます 要求されました を使用してフレームレート--fps N' オプション;しかし、それはあなたが実際にそのフレームレートを取得するという保証ではありません。たとえば、私は取得します:

recordmydesktop --fps 25
...
Saved 2983 frames in a total of 6023 requests
...

...テストソフトウェアが実行されているキャプチャ用。つまり、 実際に達成されました レートは25*2983/6032 = 12.3632 FPSに似ています!

明らかに、フレームはドロップされます - そして、ほとんどはそれを示しています ビデオの再生が速すぎます. 。ただし、要求されたFPSを12に下げると、保存/合計レポートに従って、11 fpsのようなものを達成します。この場合、ビデオの再生は「スピードアップ」に見えません。そして、私はまだライブビデオでそのようなキャプチャを調整しようとしていません。そのため、実際に保存されたフレームも正確なタイムスタンプを持っているかどうかはわかりません。

VNCキャプチャ

私にとってVNCキャプチャは、「ターゲット」PCでVNCサーバーを実行し、実行することで構成されています vncrec (Twibright Edition)「Recorder」PC。 VNCサーバーとして、私は使用します vino, 、「システム/設定/リモートデスクトップ(設定)」です。そしてどうやら、たとえそうであっても VINO構成 管理するのが最も簡単なものではないかもしれません、 vino サーバーは「ターゲット」PCにあまり負担ではないようです。テストソフトウェアと並行して実行されたときにクラッシュを経験していないためです。

一方、いつ vncrec 「レコーダー」PCでキャプチャしているため、「リアルタイム」で見られる「ターゲット」デスクトップを示すウィンドウも上げられます。 「ターゲット」に大きな更新(つまり、Windows全体が移動する)がある場合 - 非常に目に見えて、「レコーダー」の更新/更新レートの問題を見ることができます。しかし、小さな更新のみ(つまり、静的な背景に移動するカーソルだけです)では、物事は大丈夫だと思われます。

これは、この投稿に関する私の主な質問の1つについて疑問に思います - それは何ですか、それはVNC接続でフレームレートを設定しますか?

私はこれに対する明確な答えを見つけていませんが、情報の断片から(以下の参照を参照してください)、私はそれを集めます:

  • VNCサーバーは、受信したときに、できるだけ早く変更(画面の変更 +クリックなど)を送信するだけです。サーバーが利用できる最大ネットワーク帯域幅によって制限されています
  • VNCクライアントは、ネットワーク接続によって遅延およびジッタリングされた変更イベントを受信し、デスクトップの「ビデオ」ストリームをできるだけ早く再構築しようとします。

...つまり、安定した周期的なフレームレート(ビデオのように)という点で何も述べることはできません。

の限り vncrec クライアントが進むにつれて、私が得る最終ビデオは通常10 fpsとして宣言されますが、フレームはかなり置き換えられる/ジッタ化される可能性があります(ビデオ編集者のカッティングが必要です)。に注意してください vncrec-twibright/readme 州:」映画のサンプルレートは、デフォルトで10またはVNCREC_MOVIE_FRAMERATE環境変数によるOverRiden、または指定されていない場合は10です。「;しかし、マンページも述べています」VNCREC_MOVIE_FRAMERATE-出力ムービーのフレームレートを指定します。 -Movieモードでのみ効果があります。デフォルトは10になります。10からトランスコダーが嘔吐したら24を試してください。「。そして、調べたら」vncrec/sockets.c「ソース、見ることができます:

void print_movie_frames_up_to_time(struct timeval tv)
{
  static double framerate;
  ....
  memcpy(out, bufoutptr, buffered);
  if (appData.record)
    {
      writeLogHeader (); /* Writes the timestamp */
      fwrite (bufoutptr, 1, buffered, vncLog);
    }

...これは、いくつかのタイムスタンプが書かれていることを示していますが、それらのタイムスタンプが「オリジナル」のターゲットPCに由来するかどうか、または「レコーダー」のPCに由来するかどうかはわかりません。編集: :@kanakaの答えのおかげで、私はチェックしました vncrec/sockets.c 繰り返しますが、それがあることがわかります writeLogHeader 関数自体が呼び出します gettimeofday;したがって、それが書いているタイムスタンプはローカルです - つまり、それらは「レコーダー」PCから発生します(したがって、これらのタイムスタンプは、「ターゲット」PCでフレームがいつ発生したかを正確に説明していません).

いずれにせよ、サーバーが送信しているように思えます - そして vncrec クライアントが受信するように - いつでも;そして、その後の生のキャプチャからビデオファイルをエンコードするプロセスでのみ、何らかの形のフレームレートが設定/補間されます。

また、「ターゲット」ラップトップで、 有線ネットワーク接続が壊れています;したがって、ワイヤレスは、ルーターとローカルネットワークにアクセスするための私の唯一のオプションです - ルーターが有線接続から処理できる100MB/sよりもはるかに低い速度です。ただし、キャプチャされたフレームのジッターが「ターゲット」PCにロードされたために間違ったタイムスタンプが原因である場合、良いネットワーク帯域幅があまり役に立たないと思います。

最後に、VNCに関する限り、他の選択肢がある可能性があります - vncast サーバー(有望ですが、ソースから構築するためにしばらく時間がかかり、「初期の実験バージョン」にあります);また multivnc (ただし、録音のオプションがないクライアント/ビューアのように見えます).

x11grabを含むffmpeg

これはあまり遊んでいませんが、私はそれを試してみました netcat;これ:

# 'target'
ffmpeg -f x11grab -b 8000k -r 30 -s 800x600 -i :0.0 -f rawvideo - | nc 192.168.1.100 5678
# 'recorder'
nc -l 0.0.0.0 5678 > raw.video  #

...ファイルをキャプチャしますが ffplay キャプチャされたファイルを適切に読み取ることができません。その間:

# 'target'
ffmpeg -f x11grab -b 500k -r 30 -s 800x600 -i :0.0 -f yuv4mpegpipe -pix_fmt yuv444p - | nc 192.168.1.100 5678
# 'recorder'
nc -l 0.0.0.0 5678 | ffmpeg -i - /path/to/samplimg%03d.png

.png画像を生成しますが、圧縮アーティファクトがあります(に関与する圧縮の結果 yuv4mpegpipe, 、 私は推測する)。

したがって、私は好きではありません ffmpeg+x11grab 現在は多すぎる - しかし、多分私は自分のニーズのためにそれをセットアップする方法を単に知らないかもしれません。

*(グラフィックカード - > DMA->ネットワーク)

確かに、このようなものが存在するかどうかはわかりません - 実際、私はそれを賭けないだろう:)そして私はここで専門家ではないが、私は推測します:

DMAメモリ転送をグラフィックカード(または現在のデスクトップビットマップを保持するバッファー)から開始できる場合 ソース, 、およびネットワークアダプターとして 行き先 - 原則として、正しい(そしてまともな)フレームレートで圧縮されていないデスクトップキャプチャを取得できるはずです。もちろん、DMA転送を使用するポイントは、デスクトップ画像をネットワークインターフェイスにコピーするタスクからプロセッサを解放することです(したがって、キャプチャソフトウェアが「ターゲット」PCで実行されているプロセス、特にRAMまたはハードディスクを扱うプロセスに与える影響を減らします).

もちろん、このような提案は、次のとおりです。800x600の場合、30 fps少なくとも800*600*3*30 = 43200000 bps = 42 mib/s、これはローカル100 mb/sネットワークでは問題ありません); 「録音」を行う他のPCのハードディスクがたくさんあり、最後に、その生データを読み、それに基づいて画像シーケンスまたはビデオを生成できるソフトウェア:)

安定したフレームレートと非圧縮データの両方に対して保証がある限り、帯域幅とハードディスクの要求が私と一緒に暮らすことができます。だからこそ、このようなものがすでに存在するかどうか聞きたいです。

-- -- -- -- -- 

まあ、私はそれだったと思います - 私がそれを置くことができるのと同じくらい短いです:)ツールの提案 - またはプロセス(es)は、デスクトップキャプチャで生じる可能性があります

  • 非圧縮形式(最終的には圧縮されていない/ロスレスPNG画像シーケンスに変換可能)、および
  • 「正しくタイムコード化された」、安定したフレームレートがあります

...、それは最終的に「簡単な」「ピクチャーインピクチャ」オーバーレイビデオを生成するための単一のコマンドライン処理に役立ちます - 大歓迎です!

コメントを前もってありがとう、
乾杯!


参照

  1. CryptoteのLinuxでスクリーンキャストを作成する経験-Idlebox.net
  2. ビデオランフォーラム•トピックを表示-VNCクライアント入力サポート(画面://など)
  3. vncServerスロットルスロークライアントのユーザーInpt -kyprianou、mark -com.realvnc.vnc -list -markmail
  4. Linux FAQ -X Windows:VNCを使用してリモートデスクトップを表示および制御するにはどうすればよいですか
  5. VNCにはどのくらいの帯域幅が必要ですか? RealVNC-よくある質問
  6. X11VNC:実際のXディスプレイ用のVNCサーバー
  7. howtorecordvnc(x11セッション) - debian wiki
  8. UbuntuのGTK-RecordMyDeskTopに代わるもの
  9. (ffmpeg-user)ffmpegでパイプを使用するにはどうすればよいですか
  10. (ffmpeg-devel)(パッチ)x1ggrabでsegfaultを修正xfixes拡張子をサポートしていないxserversにカーソルを描画するとき
役に立ちましたか?

解決

質問はありますが、このような長い井戸のバッジを取得する必要があります。 ;-)

主な質問に答えて、VNCは、ストリーミングビデオプロトコルではなく、リモートフレームバッファプロトコル(したがって頭字語)であるRFBプロトコルを使用します。 VNCクライアントは、クライアントが関心を持っているビューポート領域とインクリメンタルフラグを含むFrameBufferUpDatereQuestメッセージをサーバーに送信します。インクリメンタルフラグが設定されていない場合、サーバーは要求された領域のコンテンツを含むFrameBufferUpDateメッセージで応答します。インクリメンタルフラグが設定されている場合、サーバーは、クライアントが最後にその領域を送信したときから変更された地域のどの部分を含むフレームバッファーアップデートメッセージで応答する場合があります。

要求と更新がどのように相互作用するかの定義は、鮮明に定義されていません。何も変更されていない場合、サーバーは必ずしもすべてのリクエストにアップデートを使用して応答するわけではありません。サーバーがクライアントからキューに登録されている複数のリクエストがある場合、それに応じて単一の更新を送信することも許可されています。さらに、クライアントは実際にサーバーからの非同期更新メッセージに応答できる必要があります(リクエストに応じてではありません)そうしないと、クライアントは同期しなくなります(RFBはフレーム付きプロトコルではないため)。

多くの場合、クライアントは、定期的なインターバルでフレームバッファービューポート全体のインクリメンタル更新リクエストを送信し、到着時にサーバーの更新メッセージを処理するために単純に実装されます(つまり、リクエストと更新を結び付ける試みは行われません)。

ここ FrameBufferUpDatereQuestメッセージの説明です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top