19

私は新しい Android camera2 API でテストしており、カメラから各フレームを制御したいと考えています。このために行うことは、 ImageReaderを作成し、解像度と画像形式を設定することです。

ImageReader imageReader = ImageReader.newInstance(1280,720,ImageFormat.YUV_420_888,1);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = reader.acquireLatestImage();
        Log.i(MainActivity.LOG_TAG,"imageReader: "+System.currentTimeMillis());
        image.close();
    }
},null);

その後、パラメーターTEMPLATE_PREVIEWを使用して新しいCaptureRequestを作成し、ターゲットを追加します。cameraCaptureSession の場合、このリクエストで新しい setRepeatingRequest を作成しますimageReader

 try {
    final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

    builder.addTarget(imageReader.getSurface());

    mCameraDevice.createCaptureSession(
            Arrays.asList(imageReader.getSurface()),
            new CameraCaptureSession.StateCallback() {
                @Override
                public void onConfigured(CameraCaptureSession session) {
                    mSession = session;
                    try {
                        mSession.setRepeatingRequest(builder.build(),null,null);
                    } catch (CameraAccessException e) {
                        e.printStackTrace();
                    }
                }
                @Override
                public void onConfigureFailed(CameraCaptureSession session) {

                }
            },
            null
    );
} catch (CameraAccessException e) {
    e.printStackTrace();
}

カメラを開いてプレビューで表示を開始すると、例外が発生します。しかし、例外の前にプレビュー画像を取得し、その後例外があります

10-30 16:00:32.850    1390-1894/.camera2tutorial E/BufferQueueProducer﹕ [unnamed-1390-1] dequeueBuffer: BufferQueue has been abandoned
10-30 16:00:32.850    1390-1894/.camera2tutorial E/Legacy-CameraDevice-JNI﹕ LegacyCameraDevice_nativeProduceFrame: Error while producing frame No such device (-19).
10-30 16:00:32.850    1390-1894/.camera2tutorial W/SurfaceTextureRenderer﹕ Surface abandoned, dropping frame.
    android.hardware.camera2.legacy.LegacyExceptionUtils$BufferQueueAbandonedException
            at android.hardware.camera2.legacy.LegacyExceptionUtils.throwOnError(LegacyExceptionUtils.java:64)
            at android.hardware.camera2.legacy.LegacyCameraDevice.produceFrame(LegacyCameraDevice.java:516)
            at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:699)
            at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103)
            at android.os.Handler.dispatchMessage(Handler.java:98)
            at android.os.Looper.loop(Looper.java:145)
            at android.os.HandlerThread.run(HandlerThread.java:61)

どうすればこれを修正できますか??

Samsung Galaxy S5 と Android API 21 を使用しています

4

3 に答える 3

32

作成した ImageReader への参照を保持していることを確認してください。おそらく、mSession が定義されている場所であればどこでもかまいません。

ImageReader から取得した Surface は、弱いポインターとほぼ同等です。ImageReader がガベージ コレクションを取得するのを妨げることはありません。そのため、(命名に基づいて) ImageReader が破棄され、放棄エラーが発生する可能性が最も高くなります。

于 2015-11-02T00:19:18.977 に答える