2012-12-27 65 views
2

我希望能够使用OpenGL创建视频输出文件,而不是屏幕输出中的通常显示。我想通过不使用glutPostRedisplay()或(SFML版本,这是这样的:) window.Display(),并以某种方式使用glReadPixels()来代替。OpenGL - 创建视频输出文件

glReadPixels使像素内容到内存中的数组(正如你可能已经知道了),但我怎么可以转换成一个框架,并串几帧一起在一个视频文件?视频文件的格式是什么,以便我可以播放它?

我应该解释为什么我想这样做:很多物理模拟的可能需要很长的时间来计算足够的信息来显示一帧,所以最好是离开它运行过夜,播放视频文件,第二天早上。你不会想每五分钟回来一次,看看发生了什么。

+0

您可以将其存储在原始帧(RGBA)中,并稍后处理它。与gstreamer。 (这也允许将转换管道嵌入到应用程序中)。 –

+0

所以gstreamer是我可以在我的代码中包含的东西,并传递一些原始帧,我会得到一个ogg或mpeg或输出? – user3728501

+0

或多或少。它是一个完整的框架,因此对于一个应用程序至少可以看起来很臃肿;但是如果你已经知道例如。 unix风格的管道和过滤器,没有太多的学习曲线。 –

回答

4

glutPostRedisplay是具体的过剩和不是OpenGL的一部分。

你通常做的屏幕外着色使用一个p缓冲器或使用隐藏的窗口和帧缓冲区对象。

将图像转换为视频可以通过各种方式完成。例如,您可以使用FFmpeg使用image2pipe作为输入格式,并将原始图像数据写入ffmpeg过程标准输入。一个更简单的方案是将每个帧转储到单独的图像文件中。使用libpng很简单。然后,您可以将各个图像合并为一个视频。

但是,当进行物理模拟时,您不应该将最终渲染转储到文件中。相反,您应该存储模拟数据以供以后播放,因为您可以调整渲染参数而无需重新模拟所有内容。你将不得不对渲染器进行调整!

+0

这是一个好主意,存储数据,谢谢。 – user3728501