伙计们,
我正在使用 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){}
}