C++ 不使用单独的程序或库录制opengl视频

C++ 不使用单独的程序或库录制opengl视频,c++,freeimage,C++,Freeimage,如何从FIBITMAP(自由图像)对象获取数据并将其存储到二进制文件中 我已经知道如何将数据存储为图像,但我希望将其存储为类似于Fraps的视频。我的目标是创建FIBITMAP图像列表,并将其写入二进制(.avi或.mp4格式)文件 这是我的截图代码: BYTE* pixels = new BYTE[ 3 * width * height]; glReadPixels(0, 0, width, height, GL_BGR, GL_UNSIGNED_BYTE, pixels);

如何从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;

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

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

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


也许在你的位置上,我会想到运动JPEG。与你所做的相比,这是最接近现实的事情。只有在这种情况下,单个帧不是PNG而是JPEG。

没问题。我的回答很笼统,我不知道它有多有用。你写过编解码器吗?AVI主要作为视频容器,通常包含视频流和音频流。无论您将使用什么视频API,您都能够逐个输入视频的图像文件(一帧接一帧),编解码器的输出将是编码的视频流。您需要将该视频流输出字节流作为容器格式要求存储在容器的视频流中。