Android camera2图像阅读器导致冻结

Android camera2图像阅读器导致冻结,android,android-camera2,firebase-mlkit,image-reader,Android,Android Camera2,Firebase Mlkit,Image Reader,我一直在opengl应用程序中使用camera2来编写SurfaceTexture。由于这会使图像格式错误,我决定使用ImageReader对象捕获相机输出,如MLKit推荐的:ImageFormat.YUV_420_888 当我添加这个时,一切似乎正常,但当我的应用程序的FPS下降一秒钟时,相机停止更新(仅在我使用ImageReader时发生) 我看到过这样的帖子: 然而,我有 ImageReader reader = ImageReader.newInstance(100,

我一直在opengl应用程序中使用camera2来编写SurfaceTexture。由于这会使图像格式错误,我决定使用ImageReader对象捕获相机输出,如MLKit推荐的:
ImageFormat.YUV_420_888

当我添加这个时,一切似乎正常,但当我的应用程序的FPS下降一秒钟时,相机停止更新(仅在我使用ImageReader时发生)

我看到过这样的帖子:

然而,我有

        ImageReader reader = ImageReader.newInstance(100, 100,
                ImageFormat.YUV_420_888, 3);
        reader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Log.d("FINDME", " ON AVAILABLE STARTED");


                Image image = null;
                try {
                    image = reader.acquireNextImage();
                    //Do whatever you want with your Image
                    if (image != null) {
                        image.close();
                    }
                } catch (IllegalStateException iae) {
                    if (image != null) {
                        image.close();
                    }
                }


                Log.d("FINDME", " ON AVAILABLE DONE");
            }
        }, handler2);

        Surface previewSurface = new Surface(mSurfaceTexture);
        mSurfaces.add(previewSurface);
        mSurfaces.add(reader.getSurface());
        mPreviewBuilder.addTarget(previewSurface);
        mPreviewBuilder.addTarget(reader.getSurface());

        mCameraDevice.createCaptureSession(mSurfaces, mCaptureSessionStateCallback,
                mBackgroundHandler);
而且似乎没有帮助。如果FPS保持较高,它确实可以正常运行,但是如果我尝试切换到不同的渲染功能(着色器),FPS可能会在一瞬间下降,从而冻结摄影机。应用程序仍然运行良好,只是相机源不再更新,也永远不会恢复。并不是所有着色器都会导致这种情况,只有那些涉及面更广的着色器才会导致这种情况

在logcat中,我看到:

12-12 22:50:43.824 21329 23300 D FINDME  :  ON AVAILABLE DONE
12-12 22:50:43.854 21329 21371 I MediaRecorderJNI: finalize
12-12 22:50:43.854 21329 21371 I MediaRecorderJNI: release
12-12 22:50:43.854  1015 17804 D MPEG4Writer: Video track stopping. Stop source
12-12 22:50:43.854  1015 17804 E MPEG4Writer: Stop() called but track is not started
12-12 22:50:43.854  1015 17804 D MPEG4Writer: Audio track stopping. Stop source
12-12 22:50:43.854  1015 17804 E MPEG4Writer: Stop() called but track is not started
12-12 22:50:43.855  1015 22459 I ACodec  : [OMX.SEC.naac.enc] Now Executing->Idle
12-12 22:50:43.855  1090 22460 I SEC_BASE_COMP: SEC_OMX_ComponentStateSet: Cur(3) -> Dest(2)
12-12 22:50:43.857  1015 22459 I ACodec  : [OMX.SEC.naac.enc] Now Idle->Loaded
12-12 22:50:43.860  1090 22460 I SEC_BASE_COMP: SEC_OMX_ComponentStateSet: Cur(2) -> Dest(1)
12-12 22:50:43.861  1015 22459 I ACodec  : [OMX.SEC.naac.enc] Now Loaded
12-12 22:50:43.861  1090 25268 I SEC_BASE_COMP: [OMX.SEC.naac.enc]: Normally terminated
12-12 22:50:43.862  1015 22459 I ACodec  :  [OMX.SEC.naac.enc] Now uninitialized
12-12 22:50:43.862  1015 22459 I ACodec  :  [] Now kWhatShutdownCompleted event : 8544
12-12 22:50:43.862  1015 22459 I MediaCodec: Codec shutdown complete
12-12 22:50:43.865  1015 17804 I StagefrightRecorder: property set(service.camera.rec.running, 0) result = 0
12-12 22:50:43.866  1015 22451 I ACodec  : [OMX.qcom.video.encoder.avc] Now Executing->Idle
12-12 22:50:43.883  1015 22451 I ACodec  : [OMX.qcom.video.encoder.avc] Now Idle->Loaded
12-12 22:50:43.883  1015 22451 I ACodec  : [OMX.qcom.video.encoder.avc] Now Loaded
12-12 22:50:43.891  1090  5365 I OMX-VENC: Component Deinit
12-12 22:50:43.891  1090  5365 I OMX-VENC: Video encode perflock released
12-12 22:50:43.892  1015 22451 I ACodec  :  [OMX.qcom.video.encoder.avc] Now uninitialized
12-12 22:50:43.892  1015 22451 I ACodec  :  [] Now kWhatShutdownCompleted event : 8544
12-12 22:50:43.893  1015 22450 I MediaCodec: Codec shutdown complete
12-12 22:50:43.893  1015 22450 I ResourceManagerService: MediaInfo removed 2397600 (width 1080 height 2220) remained 15297120 
12-12 22:50:43.893  1015 22450 I ResourceManagerService: getMediaResourceInfo resourceType : 2, size : 1
12-12 22:50:43.893  1015 22450 I ResourceManagerService: writeResourceInfo (PID : 21329, clientID : 3989906560, non-secure-codec/video-codec:1, 1080x2220(fps:30) - SoftCodec : No, Encorder : Yes)
12-12 22:50:43.893 28011 28024 V ResourceManagerHelper-JNI: JNIMediaResourceHelper::notify eventType : 2, ext1 : 0, ext2 : 0
12-12 22:50:43.893 28011 28024 V ResourceManagerHelper-JNI: notify eventType : 2, ext1 : 0, ext2 : 0
12-12 22:50:43.893  3381 29213 V ResourceManagerHelper-JNI: JNIMediaResourceHelper::notify eventType : 2, ext1 : 0, ext2 : 0
12-12 22:50:43.893  3381 29213 V ResourceManagerHelper-JNI: notify eventType : 2, ext1 : 0, ext2 : 0
12-12 22:50:43.893 28011 28024 I SemMediaResourceHelper: makeMediaResourceInfo mOwnResourceEventExcluded : false, mPid : 28011
12-12 22:50:43.893 28011 28024 I SemMediaResourceHelper: [1] makeMediaResourceInfo resourceType : 2 isSecured : false, pid : 21329, client id : 3989906560
12-12 22:50:43.893  3381 29213 I SemMediaResourceHelper: makeMediaResourceInfo mOwnResourceEventExcluded : false, mPid : 3381
12-12 22:50:43.893  3381 29213 I SemMediaResourceHelper: [1] makeMediaResourceInfo resourceType : 2 isSecured : false, pid : 21329, client id : 3989906560
12-12 22:50:43.893 28011 28047 I SemMediaResourceHelper: onRemove
12-12 22:50:43.893  3381  3381 I SemMediaResourceHelper: onRemove
12-12 22:50:43.893 28011 28047 I DrmMediaResourceHelper: onRemove size = 1
12-12 22:50:43.893 28011 28047 E DrmMediaResourceHelper: onRemove making Dpdrm to 0 second point 
12-12 22:50:43.895   691 11810 V APM_AudioPolicyManager: releaseInput() 1630
12-12 22:50:43.895   691 11810 V APM_AudioPolicyManager: closeInput(1630)
12-12 22:50:43.896 28011 28047 E DrmManagerClient: DRM_DISPLAYPORT_DISABLE failed
12-12 22:50:43.896  1015 17804 V MediaPlayerService: Delete media recorder client
12-12 22:50:43.897   691 11810 D MultiRecordManager: closeInputStream() moduleHandle:10, modulename:primary, stream_in:0xeab9f0d0, source:0, dev:0xeab95fb0
12-12 22:50:43.897   691 11810 I MultiRecordManager: closeInputStream() skipMultiRecord
12-12 22:50:43.897 21329 21371 W System  : A resource failed to call release. 
12-12 22:50:43.898   691 11810 V APM_AudioPolicyManager: releaseInput() exit
12-12 22:50:43.898 21329 22463 E FINDME: VideoFragment: onClosed: android.hardware.camera2.impl.CameraCaptureSessionImpl@83f26d4
12-12 22:50:43.898   691 30849 V APM_AudioPolicyManager: listAudioPorts() role 0 type 0 num_ports 0 ports 0xeab97700
12-12 22:50:43.898   691 30849 V APM_AudioPolicyManager: listAudioPorts() got 0 ports needed 11
12-12 22:50:43.899   691 30849 V APM_AudioPolicyManager: listAudioPorts() role 0 type 0 num_ports 11 ports 0xe70d8d80
12-12 22:50:43.899   691 30849 V APM_AudioPolicyManager: listAudioPorts() got 11 ports needed 11
12-12 22:50:43.899   653  1131 D audio_hw_primary: adev_close_input_stream: enter:stream_handle(0xe885a500)
12-12 22:50:43.899   653  1131 V audio_hw_sec: sec_stop_voice_note_recording
12-12 22:50:43.899   653  1131 D audio_hw_primary: in_standby: enter: stream (0xe885a500) usecase(18: audio-record)
12-12 22:50:43.900   691 11810 V APM_AudioPolicyManager: listAudioPorts() role 0 type 0 num_ports 0 ports 0xeab976a8
12-12 22:50:43.900   691 11810 V APM_AudioPolicyManager: listAudioPorts() got 0 ports needed 11
12-12 22:50:43.900   691 11810 V APM_AudioPolicyManager: listAudioPorts() role 0 type 0 num_ports 11 ports 0xe7093580
12-12 22:50:43.900   691 11810 V APM_AudioPolicyManager: listAudioPorts() got 11 ports needed 11
12-12 22:50:43.908 21329 21376 E BufferQueueProducer: [ImageReader-1280x720f23m3-21329-3] queueBuffer: BufferQueue has been abandoned
12-12 22:50:43.908   982 23334 E Surface : queueBuffer: error queuing buffer to SurfaceTexture, -19
12-12 22:50:43.908   982 23334 E Camera3-OutputStream: returnBufferCheckedLocked: Stream 1: Error queueing buffer to native window: No such device (-19)
12-12 22:50:43.908   982 23334 E Camera3-Device: Can't return buffer to its stream: No such device (-19)
12-12 22:50:43.940 21329 21376 E BufferQueueProducer: [ImageReader-1280x720f23m3-21329-3] dequeueBuffer: BufferQueue has been abandoned
12-12 22:50:43.940   982 23322 E Camera3-OutputStream: getBufferLockedCommon: Stream 1: Can't dequeue next output buffer: No such device (-19)
12-12 22:50:43.940   982 23322 E Camera3-Device: RequestThread: Can't get output buffer, skipping request: No such device (-19)
12-12 22:50:43.949 21329 21376 E BufferQueueProducer: [ImageReader-1280x720f23m3-21329-3] queueBuffer: BufferQueue has been abandoned
12-12 22:50:43.950   982 23334 E Surface : queueBuffer: error queuing buffer to SurfaceTexture, -19

侦听器是否没有被再次调用,或者是否由于FPS下降而挂起
reader.acquireNextImage()
?如果是后者,您可以尝试使用
reader.acquireLastImage()
,它将获取相机上的最新图像。不再调用它。我已验证对侦听器的最后一次调用是否已完成。我也尝试了获取LastImage,但没有产生任何影响。我注意到您正在图像侦听器上传递
null
,这似乎表明代码正在UI线程上运行,如果您不是从后台处理程序调用它,也就是说。可能尝试创建一个背景线程(带有一个活套,可以是
HandlerThread
),在那里使用侦听器,然后添加着色器并将其显示在UI线程的曲面上。这样,与摄像机相关联的线程就不会停止,因此监听器应该是稳定的。我已经更新,所以createCaptureSession使用handler1,监听器在handler2上运行,但它仍然崩溃。问题似乎是surfacetexture目标被阻止,而imagereader继续运行,并认为它不再被更新,因此它会自毁。但除了贴出的日志之外,我没有理由离开。更新了更多的代码。崩溃似乎与释放实例的图像读取器不同,你有崩溃的实际堆栈跟踪吗?如果是的话,你能把它贴在问题里吗?也许我们可以在那里帮忙。