gpt4 book ai didi

c++ - SDL2 C++ 捕获渲染器动画/ Sprite 的视频

转载 作者:行者123 更新时间:2023-11-28 05:27:33 25 4
gpt4 key购买 nike

我有一个使用 SDL2 创建的动画/ Sprite 。将动画渲染到屏幕时效果很好。但是现在我也想把它录制成一个视频文件(本地存储)。为此,我计划使用 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我的问题陈述的正确方法是什么?

最佳答案

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

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

同样在性能方面,这种回读也不会很好(但无论如何压缩本身可能要重得多)。

关于c++ - SDL2 C++ 捕获渲染器动画/ Sprite 的视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40231004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com