【问题标题】:capturing openGL graphics in a video在视频中捕获 OpenGL 图形
【发布时间】:2011-02-16 17:05:00
【问题描述】:

我已经编写了一个 openGL 应用程序,并希望制作 Glut 窗口中显示的图形的视频。你知道怎么做吗?

通过 SO 的previous question,我知道一种可能的解决方案是使用 glReadPixels 获取由 openGL 渲染的帧,然后使用 FFmpeg library 生成视频。我真的不知道如何使用 FFmpeg,所以我不确定如何编写一个获取帧并输出视频的程序。尽管原始问题中的链接已断开,但我发现 this example 的视频编码,这可能对任何试图提供帮助的人有用。

两个问题:

  1. 如何使用 FFmpeg 编写取帧并输出视频的程序?
  2. 我的应用程序是用 OCaml 编写的,所以我使用 lablgllablglut。关于在这种情况下如何实现 FFmpeg 想法的任何想法?

【问题讨论】:

    标签: opengl ocaml video-capture glut


    【解决方案1】:

    您可以使用libpng 将帧写入单个PNG 文件,然后使用命令行ffmpeg 工具将其编码为视频。

    【讨论】:

    • 如何在 openGL 中生成 PNG?此外,这将产生数以万计的文件。是不是有点过分了?
    • 不是来自 OpenGL;您仍然必须使用 glReadPixels 来获取帧缓冲区内容,然后使用 libpng 压缩原始像素。数以万计的文件很多,但希望没有您的机器无法处理的。我用类似的技术制作了几分钟的视频,没问题。
    • png_write_png(png_ptr, info_ptr, png_transforms, NULL)的方法?但是,如果 glReadPixels 返回 void,我如何使用 libpng 访问刚刚读取的帧?
    • opengl.org/sdk/docs/man/xhtml/glReadPixels.xml 它写入您设置的缓冲区并通过void *data 交给它。这在 OCaml 中如何工作我不知道,抱歉......
    【解决方案2】:

    png 答案的变体:输出到 bmp。在Paint(或Mac上可用的任何东西)中创建相同大小的白色图像,用记事本打开它,隔离文件头(对于800 * 600,它是42 4D 36 F9 15 00 00 00 00 00 36 00 00 00 28 00 -00 00 20 03 00 00 58 02 00 00 01 00 18 00 00 00-00 00 00 F9 15 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 27),追加 glReadPixels 的结果,刷新,关闭。

    是的,有很多文件,但通常不是问题,因为大多数 openGL 应用程序不会过多地使用硬盘。

    (我知道,它很脏,但它是最简单的实现方法——我在火车上做过一次,没有任何文档)

    【讨论】:

      【解决方案3】:

      为演示捕获视频最好的方法可能是fraps

      【讨论】:

      • 听起来不错,但我使用的是 MacOS。 =/
      • 实际上,如果没有用户交互farb-rausch.de/~fg/kkapture,.kkapture 通常会更好。但是,MacOS :/
      猜你喜欢
      • 2011-04-13
      • 2010-09-14
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多