2008-09-30 72 views
11

我应该为我的用户提供一种非常简单的方法,即从我的OpenGL应用程序的主窗口中捕获视频剪辑。我正在考虑添加用于启动和停止捕获的按钮和/或键盘快捷键;当开始时,我可以要求一个文件名和其他选项,如果有的话。它必须在Windows(XP/Vista)下运行,但我也不想关闭我迄今为止能够保持开放的Linux门。从Windows中的OpenGL窗口捕获视频

该应用程序使用OpenGL片段和着色器程序,由此我绝对需要在最终的视频中产生的效果。

它看起来对我来说,有可能是有可能满足我的要求,甚至几种不同的方法(但我真的不知道我应该在哪里开始):

  • 与喜欢的startRecording功能的编码库(文件名),stopRecording和captureFrame。我可以在每帧渲染(或每秒/三分之一)之后调用captureFrame()。如果这样做会让我的程序运行速度变慢,那不是一个真正的问题。

  • 独立的外部程序,可以从我的应用程序进行编程控制。毕竟,一个独立的程序,可以而不是几乎可以做到我需要的东西......但正如所说的,它应该是非常简单的用户操作,我也很感激无缝;我的应用程序通常全屏运行。此外,应该可以作为我目前使用NSIS准备的应用程序的安装包的一部分进行分发。

  • 使用Windows API逐帧捕获屏幕截图,然后使用(例如)libraries mentioned here之一。似乎很容易找到如何在Windows中捕获屏幕截图的示例;然而,我很喜欢这样的解决方案,它并不会强迫我在WinAPI级别上弄脏我的手。

  • 使用OpenGL渲染到屏幕外目标,然后使用库来产生视频。我不知道这是否有可能,我担心它可能不会是最轻微的痛苦之路。特别是,我不希望实际渲染根据视频是否被捕获而采取不同的执行路径。此外,我会避免任何可能会降低正常非捕获模式下的帧速率的内容。

如果解决方案在这个词的任何一个意义上都是免费的,那么这会很好,但这不是绝对的要求。一般来说,越少膨胀越好。另一方面,由于原因超出这个问题,不幸的是,我无法链接任何GPL专用代码。

关于文件格式,我不能指望我的用户开始使用Google的任何编解码器,但只要还显示视频是一个基本级别的Windows用户很容易,我真的不关心什么格式是。但是,如果可以控制输出的压缩质量,那将是非常好的。

只是为了澄清:我需要从像摄像机外部设备捕获视频,我也不是在鼠标的移动我真正感兴趣的,即使让他们没有任何伤害。对音频没有要求;该应用程序不会产生任何噪音。

我使用Visual Studio 2008编写C++,这个应用程序也受益于GLUT和GLUI。我对C++和链接库以及类似的东西有着深刻的理解,但另一方面,对于我来说,OpenGL对我来说是非常新的:到目前为止,我只学到了实际完成工作的必要位。

我并不需要一个解决方案超急,可以随意把你的时间:)

回答

8

这里有两个不同的问题 - 如何从OpenGL应用程序抢框架,以及如何把它们变成一个电影文件。

第一个问题很简单,您只需使用glReadPixels()抓取每个帧(如果需要性能,则通过PBO)。

第二个问题有点难度,因为跨平台解决方案(ffmpeg)往往是GPL或LGPL。 LGPL是否可以接受您的项目? Windows的这种做法(DirectShow)有点令人头疼。

编辑:由于LGPL是好的,您可以使用ffmpeg,有关如何编码视频的示例,请参阅here

+0

是:LGPL没问题。 – Reunanen 2008-09-30 20:22:11

+0

glReadPixels()似乎是我需要的第一个问题,谢谢! – Reunanen 2008-09-30 20:37:20

+0

@MikeF:该链接是胸围 – 2011-11-17 09:26:27

0

最简单的选项是保存应用程序中的每个渲染帧,然后将它们合并到AVI中。当您拥有AVI时,有许多库可以将其转换为更优化的格式,或者可能完全跳过AVI步骤。

在获取每个帧的方面,您可以通过渲染到您的建议的离屏纹理或直接使用backbuffer作为源,如果您的硬件支持这一点。如果没有严格的帧率处罚,做这些(并且保存每帧)都会很困难。

提供您的应用程序是确定性的,您可以将用户操作“录制”为一系列输入,然后使用导出模式将这些输出依次呈现到屏幕外表面以生成AVI。

+0

帧率惩罚是可以接受的,只要它适用于真正捕捉视频时。 该应用程序在不是随机的意义上是确定性的,但显示的内容除了用户操作外,还基于外部测量设备的结果。 – Reunanen 2008-09-30 20:34:11

1

This确实寻找合并成AVI(由安德鲁的建议),但是我真的希望避免LPBITMAPINFOHEADERs等

感谢您的答案,我将在成功通知,如果有相关的漂亮将是任何:)

在此期间,额外的技巧编码从glReadPixels原始帧到视频剪辑将不胜感激。

编辑:到目前为止,Mike F建议的ffmpeg似乎是要走的路。但是,我还没有涉及到实际的实施,但希望在不久的将来改变!

0

我不得不创建一个将OpenGL渲染记录到视频中的演示项目。我使用glReadPixels来获取像素数据并使用OpenCV的cvWriteFrame创建视频。 OpenCV让你用divx甚至x264/vp8(用ffmpeg编译)编写。

我在博客文章上有一个更详细的文章以及一个示例项目。 http://tommy.chheng.com/2013/09/09/encode-opengl-to-video-with-opencv/