Android上的Image.getPlanes()太重了

时间:2016-08-10 04:52:09

标签: android surface android-mediaprojection

民间,

我正在Android上使用MediaProjection API开发屏幕捕获应用程序。

我正在使用ImageReader来实现它,但Image.getPlanes()太重了,无法捕获实时屏幕。

由于Image.getPlanes()阻塞主线程,因此看到平滑渲染屏幕时丢失了太多帧。 当我评论它时,ImageReader会获得比以前更多的图像。

我无法在后台执行Image.getPlanes(),因为在调用Image.close()之后调用了onImageAvailable。

所以,我的问题是:

  • 为什么Image.getPlanes()如此重?
  • 有没有办法实现流畅的屏幕截图?

代码如下。

public void onImageAvailable(ImageReader reader) {

    try {

        Image img = reader.acquireLatestImage();

        //Too heavy!!
        Image.Plane[] planes = img.getPlanes();

        /* Do something */

        img.close();

    }catch (Exception e){
        setImageReader();
    }
}

感谢您的帮助!

更新问题

//Background process example
@Override
public void onImageAvailable(ImageReader reader) {

    try {

        final Image img = reader.acquireLatestImage();

        new Thread(new Runnable() {
            @Override
            public void run() {

                Image.Plane[] planes = img.getPlanes();

                /* Do something */

                img.close();
                //onImageAvailable is no called Until here.
                //Because ImageReader is locked from ImageReader.acquireLatestImage() to Image.close()

            }
        }).start();

    }catch(Exception e){}
}

1 个答案:

答案 0 :(得分:0)

好的,我知道模拟器并不擅长此操作。

使用我的真实设备进行的操作很好。

我会尝试找到优化它的选项。

感谢所有帮助。