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

时间:2013-04-27 09:17:40

标签: c++ freeimage

如何从FIBITMAP(自由图像)对象获取数据并将其存储到二进制文件中。

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

这是我的ScreenShot代码:

   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;

1 个答案:

答案 0 :(得分:0)

假设您要将其保存在avi中。这是一种容器格式,它指定存储的视频流的元数据(帧的分辨率,编解码器信息等)和流本身。 在很多地方你可以研究它的格式,以及一般的RIFF。

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

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

也许在你的位置我可能会想到动态JPEG。与您的工作相比,这是最接近现有的东西。只有在这种情况下,单个帧不是png而是jpegs。