我有一个使用SDL2创建的动画/精灵。将动画渲染到屏幕时动画效果很好。但现在我也希望它被录制成一个视频文件(本地存储)。为此,我计划使用FFmpeg API,我将发送原始RGB像素数据阵列。
我的问题是从SDL2 API获取数据。
我尝试的是:
// From http://stackoverflow.com/questions/30157164/sdl-saving-window-as-bmp
SDL_Surface *sshot = SDL_CreateRGBSurface(0, 750, 750, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
SDL_RenderReadPixels(gRenderer, NULL, SDL_PIXELFORMAT_ARGB8888, sshot->pixels, sshot->pitch);
// From https://wiki.libsdl.org/SDL_RWFromMem
char fName[50];
sprintf(fName, "/tmp/a/ss%03d.bmp", fileCnt);
char bitmap[310000];
SDL_RWops *rw = SDL_RWFromMem(bitmap, sizeof(bitmap));
SDL_SaveBMP_RW(sshot, rw, 1);
以上不起作用。但是使用以下代码将单个帧转储到文件中:
SDL_SaveBMP(sshot, "/tmp/alok1/ss.bmp")
这显然不是一个可接受的解决方案 - 写入数千个BMP,然后使用命令行中的FFmpeg创建视频。
我做错了什么?如何从SDL_RWops中提取数据? SDL_RWFromMem使用正确的方法来处理我的问题陈述吗?
答案 0 :(得分:1)
您的缓冲区太小,无法容纳指定的图像,因此无法保存在此处。将缓冲区大小增加到至少实际图像大小+ BMP标头(width*height*bpp
+ 54,但填充也需要计算(SDL_Surface指的是pitch
))。
请注意,从堆栈中取出3Mb可能会让您危险地接近溢出(但仍然可以正常,取决于相关问题之前的功能)。链调用几个占用大量堆栈的函数可能会很快耗尽它。您可能根本不需要任何额外的空间或BMP转换 - 例如创建AVImage并从SDL_Surface直接复制像素。
同样在性能方面,这种回读效果不会很好(但是压缩本身可能更重)。