0

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

我已经知道如何将数据存储为图像,但我想将其存储为类似于 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;
4

1 回答 1

0

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

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

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

也许在你的位置,我可能会想到运动 JPEG。与您所做的相比,这是最接近现有的事情。只有在这种情况下,各个帧不是 png 而是 jpeg。

于 2013-04-27T11:28:55.767 回答