ゲームビデオのスクリーンキャプチャ


8

実行中のゲームに「フック」して、マリオブラザーズと言い、レンダリングされた各フレームをキャプチャします...そのフレームを画像ファイルに保存します。類似の良い例がFRAPSです。-注:画面/デスクトップ全体をキャプチャしたくありません。ターゲットウィンドウをキャプチャしたい。

私はOBS(Open Broadcasting Software)を見てきましたが、それほど高速ではありません。誤解しないでください。それは素晴らしいソフトウェアですが、残念ながらドキュメントがなく、cおよびc ++で書かれた大規模なプロジェクトは、cからc ++の初心者プログラマにとってほとんどアクセスできません。

私もGamingAnywhereを確認しましたが、残念ながら、動作させることができません。ドキュメントがほとんどないか、まったくなく、VS2010でのみ実行され、乱雑です(変数の命名が不適切)。ただし、これは研究プロジェクトであるため、文書化されておらず、厄介です。

これはOpenGL、GDI、Direct3Dで実行できることを知っていますが、ネット上で良い例を見つけることができません。

私はglReadlPixels(OpenGLを使用)が使用できることを読み、ドキュメントを読みましたが、この投稿では、実行中のゲーム/アプリケーショングラフィックスへのフックについては何も触れられていません。

質問:

  1. Direct3Dなどを使用して、OpenGLで開発されたゲームのグラフィックにフックできますか?フックに使用されるライブラリは、ゲームで使用されるものと同じである必要がありますか?

  2. ゲームのレンダリングされたフレームにフックして、それらのフレームを画像ファイルまたはビデオファイルに出力できるようにするにはどうすればよいですか?(ちょうど私が何をする必要があるかについてのいくつかのリンクまたは簡単な説明は素晴らしいでしょう)

  3. BackBuffer-私は、フレームを取得するためにBackBufferに非常に高速にアクセスすることを読みました。最新のライブラリを使用してこれを行う方法の例を誰かが持っていますか?ほとんどの例は古くなっています。

  4. 私の目的のために、明らかに「これはそれよりも速い」ですか?つまり、私の目的では、OpenGLの方が高速でしょうか。

積極的に開発され、文書化されているオープンソースプロジェクト(基本的に私が必要とすることを行う)を誰かが知っている場合は、それについて知りたいと思います。


これはMacのみのようで、Direct3Dでは機能しない可能性がありますが、OBSがMacで使用するSiphon Injectは、標準のビデオキャプチャよりもはるかに高速にOpenGLを使用するゲームウィンドウをキャプチャできます。サイフォンは、「アプリケーションがフレーム-フルフレームレートのビデオまたは静止画-をリアルタイムで互いに共有することを許可する」をウェブサイトに引用しています。
グライダーマン、2015年

@グライダーマンありがとう、私はそれをチェックします!
pookie、2015年

回答:


7

あなたが説明したことを実行することは可能ですが、それは簡単なプロセスではないと思います。実際には、これはターゲットとするオペレーティングシステムと密接に関連しており、特定のゲーム/アプリケーションに特定の調整が必要になることもあります。

DLLインジェクションテクニックの調査を開始します。これにより、たとえば、Direct3D(Windows)またはOpenGL APIへの呼び出しをインターセプトして、アプリケーションのフレームバッファーのコピーに使用できます。簡単なインターネット検索で、これこれについて詳しい説明が表示されます。

私はかつてカスタム共有モジュールを挿入してMacOSで小規模なOpenGLインターセプターを作成しましたが、それは非常に制御された状況下にあり、システムにroot権限を持っているなどの多くの仮定を行っていたため、本番ツールではもっとずっと複雑です。D3D APIをインターセプトして自動化されたAIボットをStarcraftにインストールすることについて、ここで別の非常に興味深いプロジェクトを見つけることができます。これは、探しているものと非常に類似した概念に触れるはずです。

基盤となるレンダリングAPIをインターセプトしたら、コードを各SwapBuffers呼び出しまたは同等の呼び出しにフックして、スワップの前に以前のフレームバッファーをコピーし、それを保存します(ここで何かglReadPixelsが実行されます)。

効率的な方法でフレームバッファをコピーして保存することも困難です。簡単な方法は、各フレームを非圧縮RGB画像としてダンプするだけですが、数分間のゲームプレイで数百ギガバイトのデータを処理するので、優れたHDDアレイがあなたのテーブル;)、あなたは何とかフレームを圧縮することを検討する必要があります。

フレームを圧縮することの欠点は、処理に多くの時間がかかることです。そのため、単純なアプローチでは、記録しようとしていたインタラクティブなアプリケーションをインタラクティブなスライドショーに変えることができます:(。したがって、この段階で最適化について考え始める必要があります。

ゲームのフレームキャプチャを効率的に行うためのライブラリを提供しているプロジェクトはありませんが、これは確かに便利です。最初に述べたように、そのようなプロジェクトを妨げている可能性があることの1つは、これはシステムに依存するものであるため、使用のケースはおそらく単一のプラットフォームまたはOSに限定されると思います。


答えてくれてありがとう。最終的には、画像を保存するのではなく、リモートマシンにストリーミングするので、フレームバッファーをコピーするのがよいでしょう。あなたはこれについてかなりの経験をしているようです。私が提起した質問のいずれかを拡張できますか?助けてくれてありがとう!
pookie、2015年

1
@pookieねえ!確かに、これは拡張できます。特にコメントしてほしいことはありますか?あなたの質問については、DLLフックで1&2を実行できると思うので、私が含めたリンク(特にスタークラフトに関するリンク)を必ずお読みください。3&4はAPI固有ですが、OpenGLでは、glReadPixelsから始めて、遅すぎる場合はそこから作業できます。私の経験は、自分のゲームのフレームの記録と過去に行われたいくつかのDLLハッキングからのものですが、サードパーティのアプリからのフレームの記録の試みで両方を組み合わせたことはありません;)
ちらつき

ありがとうございました!私はリンクをチェックしました-Windows DLLインジェクションとスタークラフトリンク(かなり素晴らしい)は良い出発点のようです。私もglReadPixelsを詳細に調べます。あなたの意見では、DirectXとOpenGLのどちらが使いやすく、どちらが速いと思いましたか?
pookie

@pookie、プログラミングの経験があれば、Direct3Dの方がはるかに使いやすくなると思います。ライブラリはよりよく設計されています。OpenGLも私の意見では「ラフエッジ」である可能性があります(これは、D3DよりもOpenGLを使用している人からのものです)。D3DはWindows専用であるため、ネガティブになる可能性があります。パフォーマンスに関しては、どれを使用しても違いはほとんどないと思います。私がおそらくあなたに与えることができる最良のアドバイスは、まずそれを機能させる方法を理解し、次に最適化について心配することです。
平気な

1
ああ、そうか、もしあなたがOOPプログラミングに精通していれば、D3Dは間違いなく簡単でしょう。OpenGLはすべて手続き型であり、多数のグローバル状態を使用します。これは、大まかに私がラフエッジについて意図したものです。幸運を祈ります!
2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.