记录没有单独程序或库的opengl视频

问题描述:

如何从FIBITMAP(*图像)对象获取数据并将其存储到二进制文件中。记录没有单独程序或库的opengl视频

我已经知道如何将数据存储为图像,但我想将其存储为类似于Fraps的视频。我的目标是创建一个FIBITMAP图像列表并以二进制文件(.avi或.mp4格式)写入它们。

这是我的截图代码:

BYTE* pixels = new BYTE[ 3 * width * height];  

glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels); 

// Convert to FreeImage format & save to file 
FIBITMAP* image = FreeImage_ConvertFromRawBits(pixels, width, height, 3 * width, 24,    0x0000FF, 0xFF0000, 0x00FF00); 
FreeImage_Save(FIF_PNG, image, "./images/test.avi"); 

// Free resources 
FreeImage_Unload(image); 
delete[] pixels; 

比方说,你想将其保存为AVI。这是一种容器格式,它指定存储的视频流的元数据(帧的分辨率,编解码器信息等)和流本身。 有许多地方你可以研究它的格式,也可以研究一般的RIFF。

另一件事是,如果你想用一个“局外人”软件来播放你的视频文件,那么你必须提供一个系统编解码器,播放器软件通过你的操作系统找到什么(你以某种方式注册编解码器,这取决于操作系统),编解码器将解码AVI中包含的视频流并将帧提供给播放器。 (实际上播放器调用解码功能的流块,你的编解码器应该合作)。

当然,在您的视频流中,每个帧都是独立编码的,而且是独立编码的。但从操作系统编解码器的角度来看,这并不重要。您的编解码器有一个标识符(FOURCC),应该将其设置到AVI编解码器部分,播放器将使用该标识符搜索编解码器。

也许在你的地方,我可能会想到动态JPEG。与你所做的相比,这是最接近现有的东西。只有在这种情况下,单个帧不是PNG,而是JPEG。

+0

感谢您的帮助队友 – 2015-04-19 04:25:17

+0

没问题。我的回答很一般,我不知道它有多有用。你写了一个编解码器吗? – 2015-04-19 07:44:44

+0

还没有。我现在正在开发一个窗口API – 2016-03-08 00:55:07