SDL2 C ++捕获渲染器动画/精灵的视频

时间:2016-10-25 03:42:55

标签: c++ c ffmpeg sdl sdl-2

我有一个使用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使用正确的方法来处理我的问题陈述吗?

1 个答案:

答案 0 :(得分:1)

您的缓冲区太小,无法容纳指定的图像,因此无法保存在此处。将缓冲区大小增加到至少实际图像大小+ BMP标头(width*height*bpp + 54,但填充也需要计算(SDL_Surface指的是pitch))。

请注意,从堆栈中取出3Mb可能会让您危险地接近溢出(但仍然可以正常,取决于相关问题之前的功能)。链调用几个占用大量堆栈的函数可能会很快耗尽它。您可能根本不需要任何额外的空间或BMP转换 - 例如创建AVImage并从SDL_Surface直接复制像素。

同样在性能方面,这种回读效果不会很好(但是压缩本身可能更重)。