我正在使用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 FPS的速度生成视频。
问题是我现在正面临
(Bitmap.createBitmap(view.getDrawingCache());
一秒钟30次?有可能吗?TL; DR
我只想以30 fps捕获特定视图的位图,我该如何实现?