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