代码之家  ›  专栏  ›  技术社区  ›  Reunanen

从Windows中的OpenGL窗口捕获视频

  •  11
  • Reunanen  · 技术社区  · 16 年前

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

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

    在我看来,甚至可能有几种不同的方法可以满足我的需求(但我真的不知道从哪里开始):

    • 具有startRecording(文件名)、stopRecording和captureFrame等功能的编码库。我可以在渲染每一帧(或每一秒/每三次/任何时间)后调用captureFrame()。如果这样做会使我的程序运行变慢,那就不是什么问题了。

    • 一个独立的外部程序,可以通过我的应用程序进行编程控制。毕竟,一个独立的程序可以

    • 使用Windows API逐帧捕获屏幕截图,然后(例如)使用 libraries mentioned here . 找到如何在Windows中捕获屏幕截图的示例似乎很容易;然而,我希望有一个解决方案,它不会真正迫使我在WinAPI级别上把我的手弄得脏兮兮的。

    • 使用OpenGL渲染到屏幕外目标,然后使用库生成视频。我不知道这是否可能,我担心这可能不是一条痛苦最少的道路。特别是,我不希望实际渲染根据是否捕获视频而采用不同的执行路径。此外,在正常的非捕获模式下,我会避免任何可能降低帧速率的事情。

    如果这个解决方案在任何一个意义上都是免费的,那就太好了,但这并不是一个绝对的要求。一般来说,肿胀越少越好。另一方面,由于这个问题之外的原因,很遗憾,我无法链接任何只支持GPL的代码。

    关于文件格式,我不能期望我的用户开始搜索任何编解码器,但只要 对于一个基本级别的Windows用户来说,这些视频已经足够简单了,我真的不在乎它的格式是什么。但是,如果能够控制输出的压缩质量,那就太好了。

    我只是想澄清一下:我 不要

    我使用Visual Studio 2008编写C++,这也非常有益于GLUT和GLUI。我对C++和链接和类库有着很好的理解,但是另一方面OpenGL对我来说是全新的:到目前为止,我只学到了实际完成任务所需的一些位。

    我不需要非常紧急的解决方案,所以请慢慢来:)

    4 回复  |  直到 8 年前
        1
  •  9
  •   Mike F Mike F    16 年前

    这里有两个不同的问题-如何从OpenGL应用程序中获取帧,以及如何将它们转换为电影文件。

    第二个问题有点难,因为跨平台解决方案(ffmpeg)倾向于GPL'd或LGPL'd。您的项目是否可以接受LGPL?Windows的这种方式(DirectShow)使用起来有点头疼。

    编辑: here 有关如何对视频进行编码的示例。

        2
  •  1
  •   Reunanen    16 年前

    This 看起来与合并到AVI非常相关(正如Andrew所建议的),但是我真的希望避免使用lpBitMapInfo等。

    同时,还提供了对原始帧进行编码的其他提示 glReadPixels 如能将视频剪辑成视频,将不胜感激。

    到目前为止,Mike F建议的ffmpeg似乎是一条可行之路。然而,我还没有进入到实际的实现中,但希望在不久的将来会有所改变!

        3
  •  0
  •   Andrew Grant    16 年前

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

    在获取每个帧方面,您可以按照建议渲染到屏幕外纹理,或者直接使用backbuffer作为源(如果您的硬件支持的话)。如果帧速率没有受到严重的惩罚,那么执行这两项操作(并保存每一帧)都将非常困难。

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

        4
  •  0
  •   tommy chheng    11 年前

    我必须创建一个将OpenGL渲染记录到视频中的演示项目。我曾经 glReadPixels 获取像素数据并使用OpenCV创建视频 cvWriteFrame . OpenCV允许您使用divx甚至x264/vp8(使用ffmpeg编译)进行编写。

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