У меня есть анимация/спрайт, созданный с использованием SDL2. Анимация отлично работает, когда она отображается на экране. Но теперь я также хочу, чтобы это было записано в видеофайл (локально сохраненный). Для этого я планирую использовать API-интерфейсы FFmpeg, к которым я отправлю необработанный массив данных пикселей RGB.SDL2 C++ Capturing Video of Renderer Animation/Sprite
Проблема с извлечением данных из API SDL2.
То, что я попытался это:
// 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")
Это, очевидно, не является приемлемым решением - Дать тысячи КМБ, а затем с помощью FFmpeg из командной строки для создания видео.
Что я делаю неправильно? Как вы извлекаете данные из SDL_RWops? Является ли использование SDL_RWFromMem правильным подходом к моей проблеме?
'750 * 750 * 4' больше, чем' 310000'. Ваш буфер слишком мал. (вам потребуется ширина 'width * height * bpp' + байтов заголовка BMP, по крайней мере) – keltar
Да, вы правы. Большое спасибо за указание на это. Я подсчитал, что он близок к 2.5 МБ, и, чтобы быть в безопасности, я хотел выделить 3 МБ. Пропустил нуль. Я могу принять это как ответ, если вы опубликуете его как таковой. Если вы считаете, что это слишком тривиально, я удалю вопрос. Еще раз спасибо! – alok