Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在没有根的情况下从Android画布捕获视频?_Android_Android Canvas_Screen Capture - Fatal编程技术网

如何在没有根的情况下从Android画布捕获视频?

如何在没有根的情况下从Android画布捕获视频?,android,android-canvas,screen-capture,Android,Android Canvas,Screen Capture,我正在开发一个绘画应用程序,带有canvas和SurfaceView,我想记录用户操作并生成视频 在这一刻,我正在尝试: public static Bitmap captureView(View v) { Log.v(CAPTURE_TAG, "init"); v.setDrawingCacheEnabled(true); v.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(v.getDrawing

我正在开发一个绘画应用程序,带有canvas和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]);
    }
}
公共类takeCaptureTask扩展了AsyncTask{
@凌驾
受保护的void onPostExecute(位图结果){
Log.v(“taskCapt”、“Fin-InitSave”);
新建saveCaptureTask()。执行(结果);
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
Log.v(“taskCapt”、“init”);
}
@凌驾
受保护位图doInBackground(视图…参数){
返回Utils.captureView(参数[0]);
}
}
最后使用NDK和ffmpeg生成视频

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

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

我对我糟糕的英语感到抱歉


非常感谢你的帮助

这取决于您的绘图方式。实际上,您可以使用位图和画布作为绘图缓冲区,这将非常容易捕获。有很多方法可以做到这一点,包括在视图发生变化时只做屏幕封盖

在释放所有触摸点时进行捕获如何?我想重现用户操作,如果用户绘制一条长路径,那么我无法重现如何绘制这条路径,只有最终结果我将应用程序用作白板,我无法预测用户是如何绘制的。如果仅在更改时进行屏幕捕获,则不会再现用户操作,只显示用户操作结果