12

Есть большое View которое меняется. Нужно записать в видео её отображения после нажатия кнопки старт и до нажатия стоп.

Как проще (лучше) это сделать? Желательно в исходном разрешении и кадров 30 в секунду.

Пробовал сохранять каждый кадр View

View.getDrawingCache()

в видео с помощью FFmpegFrameRecorder(JavaCV) , но запись одного кадра занимает, миллисекунд 200 и получается в памяти нужно хранить большое количество Bitmaps, для последующего сохранения, что конечно производит к крашу с ошибкой нехватки памяти. Была ещё мысль предварительно записывать Bitmap в файл, но запись в файл так же занимает миллисекунд 100.

Создание FFmpegFrameRecorder

FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(videoFile, width, height);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.setSampleRate(44100);
recorder.setFrameRate(FRAME_RATE);
recorder.setVideoBitrate(1200);
recorder.setVideoQuality(3);
recorder.setVideoOption("preset", "ultrafast");

P.S. Использование MediaProjection не подходит, так как он захватывает весь экран, во вторых требуется разрешение просить у пользователя

katso
  • 10,991
project_guru
  • 2,111
  • 3
  • 17
  • 39
  • 3rd пати вроде https://github.com/chibatching/android-view-recorder пробовали или нужно нативное решение? – Igor SKRYL Oct 18 '17 at 11:55
  • @IgorSKRYL Спасибо за ссылку. Можно и не нативное, только к сожалению пока не вышло собрать проект, и не ясно сможет ли программа записывать кадров 30 в секунду по большому view – project_guru Oct 19 '17 at 06:11
  • Подозреваю, основное время уходит на получение битмапа, а не на запись – bukkojot Dec 12 '17 at 12:53

1 Answers1

0

View.getDrawingCache() считается устаревшим с введением аппаратного ускорения. Поверхностно изучив тему, я сделал следующий вывод - нам не нужно получать 30 bitmap в секунду, для достижения наших 30 fps. Для начала нужно начать использовать PixelCopyAPI https://developer.android.com/reference/android/view/PixelCopy Мы как-то должны понять когда нам действительно нужно сделать захват view или можно будет использовать предыдущий (не нужен кадр если view не перерисовалась).

Для оптимизации рассмотрите вариант хранение только разницы между двумя bitmap, а затем воссоздавайте. Знаю, что есть открытые инструменты, которые таким образом оптимизируют GIF https://github.com/LucaCappelletti94/pygifsicle

FFmpeg позволяет потоковое создание видео, то-есть можно не собирать папку файлов, а сразу предоставлять кадр.

Vlad Orlinskas
  • 967
  • 5
  • 12