皆さん、
MediaProjection API を使用して、Android で画面キャプチャ アプリケーションを開発しています。
私はそれを実現するために ImageReader を使用していますが、 Image.getPlanes() は重すぎてリアルタイムの画面をキャプチャできません。
Image.getPlanes() がメイン スレッドをブロックするため、フレームを失いすぎてスムーズにレンダリングされた画面が表示されませんでした。コメントアウトすると、ImageReader は以前より多くの画像を取得します。
Image.close() が呼び出された後に onImageAvailable が呼び出されるため、バックグラウンドで Image.getPlanes() を実行できません。
だから、私の質問は次のとおりです。
- 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){}
}