Folks,
I'm developing screen capture application on Android that using MediaProjection API.
I'm using ImageReader to realize it but Image.getPlanes() is too heavy to capture realtime screen.
It lost too much frames to see smooth rendered screen since Image.getPlanes() blocks main thread. When I commented it out, ImageReader acquires many images than before.
I cannot do Image.getPlanes() in background since onImageAvailable is called after Image.close() is called.
So, my questions are:
- Why is Image.getPlanes() so heavy?
- Is there any way to realize smooth screen capture?
The code is as follows.
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();
}
}
Thank for your helps!
Question updated
//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){}
}