Я использую Lottie Animation Library , и я хочу записать это представление анимации как видео, но у этой библиотеки нет поддержки экспорта видео, поэтому я пытаюсь найти собственное решение и,
Это то, что я пробовал до сих пор.
animationView.addAnimatorUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
if((animationView.getFrame()) != previous ){
// getting single frame
previous = animationView.getFrame();
FrameLayout view = frameLayout;
Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
view.draw(canvas);
bitmaps.add(bitmap);
}
}
});
Таким образом, приведенный выше код addAnimatorUpdateListener
запускается каждый раз, когда обновляется анимация, поэтому эта функция сохраняет все растровые изображения в массиве.
for(Bitmap bitmap:bitmaps){
OutputStream stream;
try {
counter++;
stream = new FileOutputStream(imageFolder.getAbsolutePath()+"/test-"+counter+".png");
bitmap.compress(Bitmap.CompressFormat.PNG,100,stream);
Log.i(tag, "onAnimationEnd: " + "converting... " + String.valueOf(counter) + "of " + String.valueOf(animationView.getMaxFrame()));
} catch (FileNotFoundException e) {
e.printStackTrace();
Log.i(tag, "onAnimationEnd: " + e.getMessage());
}
}
Когда анимация заканчивается, код, приведенный выше, преобразует все изображения из массива растровых изображений и сохраняет их во временной папке.и затем я использую FFmpeg-Android для преобразования видео из изображений в формате mp4.
Команда FFmpeg
String[] fcommand = new String[]{"-i", path + "test-%1d.png", "-c:v", "libx264", "-vf", "fps=30", "-pix_fmt", "yuv420p", path + String.valueOf(new Date()) +".mp4"};
Из этой команды я генерирую видео в30 кадров в секунду.
Проблемы, с которыми я сталкиваюсь сейчас
- Видео не настолько плавное даже при скорости 30 кадров в секунду (420p).
(Bitmap.createBitmap(view.getDrawingCache());
30 раз в секунду?возможно ли это?
TL; DR
Я просто хочу захватить растровые изображения определенного вида со скоростью 30 кадров в секунду, как мне этого добиться?