如何将特定的观看画面屏幕录制到视频中?

时间:2019-03-29 14:05:07

标签: android android-canvas lottie-android

我正在使用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的速度生成视频。

问题是我现在正面临

  • 即使在30 fps(420p)的情况下,视频也不太流畅。
  • (Bitmap.createBitmap(view.getDrawingCache());一秒钟30次?有可能吗?

TL; DR

我只想以30 fps捕获特定视图的位图,我该如何实现?

0 个答案:

没有答案