1

伙计们,

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

我正在使用 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){}
}
4

1 回答 1

0

好的,我了解模拟器不擅长此操作。

我的真实设备的操作工作正常。

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

感谢所有帮助。

于 2016-08-11T02:08:09.370 回答