OBS 如何在 Windows 上捕获基于 OpenGL 的游戏视频?
How does OBS captures OpenGL based games video on Windows?
我正在尝试在 Windows 上捕获基于 OpenGL 的游戏的屏幕截图。网上大部分的回答都是让window可见然后截图。但是当我使用 OBS(Open Broadcaster Software) 播放我的游戏时,即使游戏 window 被最小化,它也能够播放游戏内容。
任何人都可以帮助我了解他们是如何做到的吗?
谢谢!
OpenGL API 提供了一种绘制到内部 "Frame buffer object" (FBO) 的方法,它可以被 blit 到 window。如果 OBS 不提供访问该 FBO 的方法,那么您唯一的解决方案是使 window 可见。好吧,您也可以破解广播并尝试找出这些字节...
编辑:
当 OP 澄清他的问题时,我很好奇。所以我深入研究了 OBS 代码,发现 Windows 它使用 .dll 注入和进程挂钩。
我还发现它挂钩 "swap buffers" 并使用 glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING... 获取当前帧缓冲区,复制它然后让 Windows 继续其工作。
请注意,我可能是错的。但我发现我觉得不错。
我正在尝试在 Windows 上捕获基于 OpenGL 的游戏的屏幕截图。网上大部分的回答都是让window可见然后截图。但是当我使用 OBS(Open Broadcaster Software) 播放我的游戏时,即使游戏 window 被最小化,它也能够播放游戏内容。
任何人都可以帮助我了解他们是如何做到的吗?
谢谢!
OpenGL API 提供了一种绘制到内部 "Frame buffer object" (FBO) 的方法,它可以被 blit 到 window。如果 OBS 不提供访问该 FBO 的方法,那么您唯一的解决方案是使 window 可见。好吧,您也可以破解广播并尝试找出这些字节...
编辑:
当 OP 澄清他的问题时,我很好奇。所以我深入研究了 OBS 代码,发现 Windows 它使用 .dll 注入和进程挂钩。
我还发现它挂钩 "swap buffers" 并使用 glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING... 获取当前帧缓冲区,复制它然后让 Windows 继续其工作。
请注意,我可能是错的。但我发现我觉得不错。