android - 如何将特定视图整平录制到视频中?
问题描述
我正在使用Lottie 动画库,我想将该动画视图录制为视频,但该库没有任何视频导出支持,因此我正在尝试找到自己的解决方案,并且,
这是我到目前为止所尝试的。
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 的速度生成视频。
我现在面临的问题
- 即使在 30 fps (420p) 下,视频也不是那么流畅。
(Bitmap.createBitmap(view.getDrawingCache());
一秒30次?可能吗?
TL;博士
我只想以 30 fps 的速度捕获特定视图的位图,我该如何实现呢?
解决方案
推荐阅读
- amazon-web-services - 在 AWS Elemental Mediaconvert 中将纵向视频转换为横向
- symfony - 为 Symfony MakerBundle 定义默认的 @GeneratedValue 策略
- c# - 有没有办法在 Excel 中禁用或限制对功能区/菜单栏的访问?
- java - Java 中的 FTP 单元测试(JSch 和 MockFtpServer)
- c++ - 验证字符串的整数部分
- java - 如何在 java 中读取 XML 样式的文本文件?
- java - 从资源文件夹中读取大小超过 1MB 的文件时 InputStream 为空
- reactjs - 变量没有采用 Reactjs 中变量的初始值
- git - 请在合并之前提交您的更改或存储它们
- angular - 使用 Angular 6 生成随机字符串