Есть большое 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 не подходит, так как он захватывает весь экран, во вторых требуется разрешение просить у пользователя
Ответ 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 позволяет потоковое создание видео, то-есть можно не собирать папку файлов, а сразу предоставлять кадр.