3

我正在开发一个带有画布和SurfaceView的绘画应用程序,我想记录用户操作并生成视频。

在这一刻,我正在尝试:

public static Bitmap captureView(View v) {
    Log.v(CAPTURE_TAG, "init");
    v.setDrawingCacheEnabled(true);
    v.buildDrawingCache(true);
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
    //v.destroyDrawingCache();
    v.setDrawingCacheEnabled(false); // clear drawing cache
    Log.v(CAPTURE_TAG, "Fin:");
    return b;
}

我每 50 毫秒调用一次,使用计时器和 AsynTask,在 AsynkTask 上,在 onPostExecute 方法上,我将位图保存在外部存储中:

public class takeCaptureTask extends AsyncTask<View, Void, Bitmap> {

    @Override
    protected void onPostExecute(Bitmap result) {
        Log.v("taskCapt", "Fin - InitSave");
        new saveCaptureTask().execute(result);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Log.v("taskCapt", "init");
    }

    @Override
    protected Bitmap doInBackground(View... params) {
        return Utils.captureView(params[0]);
    }
}

最后使用 NDK 和 ffmpeg 生成视频。

我的问题是性能,使用这个,每个屏幕截图需要 200 毫秒(5FPS),我至少需要 15 FPS。

我的问题是:
1-我以正确的方式在没有root的情况下进行屏幕录制?
2-我可以使用其他方法截取画布吗?
3-可以在没有root的情况下从NDK截屏吗?在这种情况下,怎么办?
4- 使用 NDK 将数据保存到外部存储更快吗?
5-如何缓冲大量图像以供以后处理?

我为我糟糕的英语道歉。

非常感谢你的帮助!

4

1 回答 1

0

这将取决于您如何绘制。您实际上可以使用 Bitmap 和 Canvas 作为绘图缓冲区,这很容易捕获。有很多方法可以做到这一点,包括只在视图发生变化时做一个屏幕截图

于 2012-10-25T20:02:52.573 回答