2

アプリケーションのコーディングを始めたばかりです。私のアイデアはStreamMyGameのようなものを作成することですが、個人的な使用のために、これを実現するシングルプレイヤーゲームトランスミッターと呼ばれるプロジェクトがすでにあります(http://sourceforge.net/projects/spgt/files/ )。

これまでのところ、エンコードもストリーミングも行っていません。ビデオをキャプチャしてアプリウィンドウに表示しているだけです。

では、エンコード/ストリーミングをどのように処理できますか?生のJPEGのUDPストリームが最も簡単なパスだと思っていましたが、よくわかりません。

また、これまでに持っているものをどのように最適化できますか?ビデオの再生には問題なく動作しますが、ゲームウィンドウをキャプチャすると、元のビデオほどきびきびとは見えません。これは、バックグラウンドで実行されていることが原因である可能性があります。それは別の質問につながります、アクティブなウィンドウの代わりに指定されたタイトルでウィンドウをキャプチャするにはどうすればよいですか?

https://github.com/fr500/desktop_streamer

編集

現在のキャプチャ方法を使用したいくつかのテスト:

ビデオプレーヤーキャプチャ(960x720p)

starting benchmark
================================================
looking for window: test.mp4
looking for window: test.mp4
looking for window: test.mp4
looking for window: test.mp4
looking for window: test.mp4
================================================
starting single thread capture only test

Time Elapsed: 19480 milliseconds
Frame Time: 32 milliseconds
Rough FPS: 30
Sleeping 2 seconds

starting single thread capture and save as bmp test

Time Elapsed: 19768 milliseconds
Frame Time: 32 milliseconds
Rough FPS: 30
Sleeping 2 seconds

starting single thread capture and save as jpg test

Time Elapsed: 28593 milliseconds
Frame Time: 47 milliseconds
Rough FPS: 20
Sleeping 2 seconds

starting dual thread capture only test

Time Elapsed: 19515 milliseconds
Frame Time: 32 milliseconds
Rough FPS: 30
Sleeping 2 seconds

starting quad thread capture only test

Time Elapsed: 19481 milliseconds
Frame Time: 32 milliseconds
Rough FPS: 30
Sleeping 2 seconds

Crysis 2キャプチャ(1024x768p)

starting benchmark
================================================
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
looking for window: Crysis 2 (TM)
================================================
starting single thread capture only test

Time Elapsed: 20003 milliseconds
Frame Time: 33 milliseconds
Rough FPS: 29
Sleeping 2 seconds

starting single thread capture and save as bmp test

Time Elapsed: 20105 milliseconds
Frame Time: 33 milliseconds
Rough FPS: 29
Sleeping 2 seconds

starting single thread capture and save as jpg test

Time Elapsed: 17353 milliseconds
Frame Time: 28 milliseconds
Rough FPS: 34
Sleeping 2 seconds

starting dual thread capture only test

Time Elapsed: 19991 milliseconds
Frame Time: 33 milliseconds
Rough FPS: 30
Sleeping 2 seconds

starting quad thread capture only test

Time Elapsed: 19983 milliseconds
Frame Time: 33 milliseconds
Rough FPS: 30
Sleeping 2 seconds

画像をBMPに保存しても実際にはオーバーヘッドは追加されませんが、JPGのように保存すると、ビデオへのオーバーヘッドエンコーディングのアイデアが得られます。それでも最大の問題は、フレーム自体を取得することです。現在のように遅すぎて、追いつくことができず、その結果、一部のフレームが欠落しています。フレームを60fps以上でキャプチャできれば、シングルプレイヤーゲームではエンコーディング+ストリーミングの遅延を実際に管理できる可能性があります。

フレームを取得するためにDXフックアプローチを試してみます。

4

2 に答える 2

2

パフォーマンス/品質の問題がバックグラウンドでの実行の影響であるかどうかはわかりませんが、あなたの質問に答えようとします。

その名前でウィンドウをキャプチャする

FindWindowアプリケーションで使用されている関数の代わりに、関数を使用してみることができると思いますGetForegroundWindow。それはあなたがそのタイトルによってウィンドウへのハンドルを得るのを許します。これを行うには(リンクを投稿したdesktop_streamerプロジェクトで)、ScreenCaptureクラスに移動して次の手順を実行します。

  • 変化する

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();
    

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
  • Captureメソッドで行を変更します

    var foregroundWindowsHandle = GetForegroundWindow();
    

    var foregroundWindowsHandle = FindWindow(null, "mywindowName");
    

私はこれをテストしていません。コードの実行に問題がある場合は、私に知らせてください。解決策を探すことができます。

FindWindow関数の詳細については、http://www.pinvoke.net/default.aspx/user32.findwindowを参照してください

パフォーマンスと画質

パフォーマンスについて話すときは、ネットワークの速度と遅延をリアルタイムで測定し、それらの情報を使用して画像の品質(圧縮レベルと解像度)を適切に調整することをお勧めします。これにより、送信される画像が時々ピクセル化される可能性がありますが、ゲームプレイの遅延の影響が減少するはずです。

また、このページを見て、2つの画面キャプチャ方法のパフォーマンスを比較することもできます。http://blog.bobcravens.com/2009/04/fastest-screen-capture-using-c-vista-vs -win7/。画面キャプチャプロセスのパフォーマンスを向上させるのに役立つ場合がありますが、ご覧のとおり、達成されるフレームレートはまだ低すぎて、高品質のゲーム体験を提供できません。

于 2012-07-14T09:14:34.070 に答える
1

最近、私はScreenStreamerと呼ばれるgolangプロジェクトを構築しました。これは、現在アクティブなウィンドウ(LinuxまたはWindows)を電話や別のPCなどの他のデバイスにMJPEGとしてストリーミングするツールであり、非常にリアルタイムです(遅延<100ms)

プロジェクトリンク:https ://github.com/fiefdx/ScreenStreamer

于 2016-11-14T05:32:22.380 に答える