【发布时间】:2010-09-14 08:38:51
【问题描述】:
我应该为我的用户提供一种非常简单的方法来从我的 OpenGL 应用程序的主窗口中捕获视频剪辑。我正在考虑添加按钮和/或键盘快捷键来开始和停止捕获;开始时,我可以要求提供文件名和其他选项(如果有)。它必须在 Windows (XP/Vista) 中运行,但我也不想关闭我迄今为止能够保持打开状态的 Linux 门。
该应用程序使用 OpenGL 片段和着色器程序,这些效果是我在最终视频中绝对需要的。
在我看来,甚至可能有几种不同的方法可以满足我的要求(但我真的不知道应该从哪里开始):
具有 startRecording(filename)、stopRecording 和 captureFrame 等函数的编码库。我可以在渲染每一帧(或每第二/第三/任何)之后调用 captureFrame() 。如果这样做会使我的程序运行速度变慢,那并不是问题。
可以通过我的应用程序以编程方式控制的独立外部程序。毕竟,一个可以控制的独立程序几乎可以满足我的需求......但正如我所说,它应该让用户操作起来非常简单,我也会欣赏无缝性;我的应用程序通常全屏运行。此外,它应该可以作为我目前使用 NSIS 准备的应用程序安装包的一部分分发。
使用 Windows API 逐帧捕获屏幕截图,然后使用(例如)libraries mentioned here 之一。似乎很容易找到如何在 Windows 中捕获屏幕截图的示例;但是,我希望有一个解决方案,它不会真正强迫我在 WinAPI 级别上弄得超级脏。
使用 OpenGL 渲染到屏幕外目标,然后使用库生成视频。我不知道这是否可能,而且恐怕无论如何这可能不是最痛苦的道路。特别是,我不希望实际渲染根据是否捕获视频而采用不同的执行路径。此外,我会避免在正常、非捕获模式下可能降低帧速率的任何事情。
如果解决方案在任何一个意义上都是免费的,那将是很好的,但这并不是一个绝对的要求。一般来说,膨胀越少越好。另一方面,由于这个问题之外的原因,很遗憾,我无法链接任何仅限 GPL 的代码。
关于文件格式,我不能指望我的用户开始搜索任何编解码器,但只要 显示视频对于基本级别的 Windows 用户来说足够容易,我不真的很关心格式是什么。但是,如果可以控制输出的压缩质量,那就太好了。
澄清一下:我不需要从摄像机等外部设备捕获视频,我对鼠标移动也不是很感兴趣,即使得到它们也不会造成伤害。对音频没有要求;该应用程序不会发出任何噪音。
我使用 Visual Studio 2008 编写 C++,因为这个应用程序也利用了 GLUT 和 GLUI。我对 C++ 和库中的链接之类的东西有扎实的了解,但另一方面,OpenGL 对我来说还是很新的:到目前为止,我真的只学到了实际完成工作所需的一些知识。
我并不急需解决方案,所以请慢慢来 :)
【问题讨论】:
标签: c++ opengl video screenshot video-capture