私は新しいAndroid カメラ2 APIでテストしており、各フレームをカメラから制御したいと考えています。私がこれを行うには、ImageReaderを作成し、解像度と画像フォーマットを設定します。その後Androidカメラ2 api BufferQueueが放棄されました
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新しいを作成し、彼imageReader
にターゲットを追加します。 cameraCaptureSessionのために私は、私はカメラを開き、私は例外を取得し、プレビューで私が持っているもののビューを開始し、この要求
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();
}
でsetRepeatingRequest新しいを作成します。しかし例外の前に私はいくつかのプレビュー画像を得て、それ以降は例外があります
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)
私はこれをどのように修正できますか?
私は、あなたはMsession定義されているところはどこでも、おそらく、あなたはあなたが作成するImageReaderへの参照を保持していることを確認しますサムスンギャラクシーS5とAndroid API 21
メソッドからローカル変数を削除しましたが、例外が解決されました。ありがとう! –
@ mr.leoこの回答を受け入れたものとみなしてください。このソリューションは私の場合でも役に立ちました。面白いのは、それはプラットフォーム固有であるということです.NexuesやAndroid 6を実行している他のデバイスではうまくいきましたが、Android 5を実行しているHTC Oneでは失敗しました。Androidの断片化の美しさ。 – stoiczek
@stoiczekどのようにしてImageReaderへの参照を具体的に保持しましたか? ( "captureRequest.addTarget(imageReader.getSurface())"以外) – Denis