马里奥·布鲁斯(Mario Bros)说,我想“挂上”正在运行的游戏,并捕获渲染的每个帧...将该帧保存到图像文件中。一个类似的例子就是FRAPS。 -注意:我不想捕获整个屏幕/桌面。我想捕获目标窗口。

我看了OBS(开放广播软件),但它并不是特别快。不要误会我的意思,它是很棒的软件,但是不幸的是,没有/缺乏文档,这使得新手C ++程序员几乎无法访问用c和c ++编写的大型项目。

我'我也看过GamingAnywhere,但不幸的是,我无法使它正常工作,几乎没有/没有文档,仅在VS2010中运行并且混乱(变量命名不佳)。但是,这是一个研究项目,因此它没有文档记载且混乱。

我知道可以使用OpenGL,GDI和Direct3D来完成此操作,但是我无法在净。

我读到可以使用glReadlPixels(使用OpenGL),并且我已经阅读了文档,但是这篇文章没有提到与运行的游戏/应用程序图形挂钩。

问题:


我可以使用Direct3D来了解使用OpenGL开发的游戏的图形吗?
用于钩子的库是否必须与游戏所使用的库相同?
如何钩入游戏的渲染帧,以便可以将这些帧输出到图像文件中?或视频文件? (只需一些链接或
简要说明一下我需要做的事情就可以了)
BackBuffer-我读到通过BackBuffer检索帧非常快。有人对我有一个例子,说明如何使用最新的库吗?我发现大多数示例都已过时。
就我的目的而言,有没有明显的“比这快”的方法?我的意思是说,对于我来说,OpenGL会更快吗?

如果有人知道一个积极开发并有充分记录的开源项目(基本上满足我的需要),那么我很想知道。

评论

现在,这似乎仅是Mac,它可能不适用于Direct3D,但是OBS在Mac上使用的Siphon Inject可以捕获使用OpenGL的游戏窗口,而捕获这些窗口的速度比标准视频捕获快得多。虹吸管“允许应用程序共享帧-全帧速视频或静止图像-彼此实时共享”引用该网站。

@Gliderman谢谢,我会检查一下!

#1 楼

可以按照您的描述进行操作,但是恐怕这不是一个微不足道的过程。实际上,这将与您所针对的操作系统紧密相关,并且可能还需要针对给定的游戏/应用程序进行特定的调整。

我将开始研究DLL注入技术,例如,它应该允许,拦截对Direct3D(Windows)或OpenGL API的调用,然后可以使用这些API复制应用程序的de framebuffers。快速的Internet搜索提供了详细说明。

我曾经通过注入自定义的共享模块在MacOS上编写了一个小型OpenGL拦截器,但是它是在非常受控制的情况下进行很多假设的,例如在系统中具有root特权,因此对于生产工具而言,它将更加复杂。您可以在此处找到另一个非常有趣的项目,该项目是拦截D3D API以在Starcraft上安装自动化AI机器人,该项目应该触及与您所寻找的非常相似的概念。

一旦您成功拦截了基础渲染API,您然后可以将代码挂接到每个SwapBuffers或等效调用中,以便仅在交换之前复制先前的帧缓冲区,然后保存它(这是glReadPixels起作用的地方)。

以有效的方式复制和保存帧缓冲区也是一项挑战。一种简单的方法是将每个帧作为未压缩的RGB图像转储,但是接下来几分钟,您将获得数百GB的数据,因此除非您有一个漂亮的HDD阵列位于您的表格;),您需要以某种方式研究压缩帧。

现在压缩帧的不利之处在于,它需要进行大量处理,因此,幼稚的方法可能会将您尝试记录的曾经是交互式的应用程序变成交互式幻灯片放映:(。因此,在这个阶段,您必须开始考虑优化。

不知道那里有任何项目可以为游戏提供有效的帧捕获库,但是拥有它当然会很不错!我认为可能会阻碍此类项目发展的一件事是,就像我一开始提到的那样,这是非常依赖系统的事情,因此使用案例很可能仅限于单个平台或OS。

评论


$ \ begingroup $
感谢您的回答。我认为最终,我将不保存图像,而是将它们流式传输到远程计算机,因此复制帧缓冲区可能是解决之道。您似乎对这方面有相当的经验。您能解决我提出的任何问题吗?谢谢您的帮助!
$ \ endgroup $
– pookie
15-10-25在10:10



$ \ begingroup $
@pookie嘿!当然可以了。您想让我特别评论什么吗?对于您的问题,我认为1&2可以通过DLL挂钩完成,因此请务必阅读我附带的链接(特别是关于starcraft的链接)。 3&4将是特定于API的,但是在OpenGL上,您可以从glReadPixels开始,如果发现它太慢,则可以从那里开始工作。我的经验是从自己的游戏录制帧,再加上过去进行的一些DLL骇客攻击,但我从未尝试过从第三方应用程序录制帧的过程中结合使用这两种方法;)
$ \ endgroup $
–glampert
15-10-25在17:13



$ \ begingroup $
谢谢!我检查了链接-Windows DLL注入和starcraft链接(非常棒)似乎是不错的起点。我也将深入研究glReadPixels。您认为DirectX或OpenGL使用哪个更容易使用,哪些使用更快?
$ \ endgroup $
– pookie
2015年10月25日17:23



$ \ begingroup $
@pookie,如果您有一定的编程经验,我认为Direct3D会更易于使用,并且库的设计也更好。在我看来,OpenGL也可能具有“粗糙的边缘”(这来自使用OpenGL而非D3D的人)。 D3D仅适用于Windows,所以可能对您不利。在性能方面,我认为您所使用的不会有太大的不同。我可能会给您的最佳建议是:首先弄清楚如何使其工作,然后担心优化。
$ \ endgroup $
–glampert
15年10月25日在18:08

$ \ begingroup $
好的,如果您熟悉OOP编程,那么D3D肯定会更容易。 OpenGL都是程序性的,并且使用了一堆全局状态,这主要是我对粗糙边缘的意思。祝您好运!
$ \ endgroup $
–glampert
15年10月25日在18:30