1

皆さん、

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){}
}
4

1 に答える 1

0

わかりました、エミュレーターがこの操作が苦手であることは理解しています。

私の実機での操作はうまくいきます。

最適化するためのオプションを見つけようとします。

すべての助けに感謝します。

于 2016-08-11T02:08:09.370 に答える