我们是一群开发人员正在开发用于Android的实时视频处理应用程序。最近,一位客户报告我们的应用程序冻结仅在Nexus 10设备上发生。我们自己购买了设备并进行了测试:
有关冻结的更多信息:
我们的应用程序在onResume活动方法中打开相机,安装预览回调,为我们的处理需求设置最佳预览尺寸(在nexus 10这是1920x1080)并启动预览(如果从睡眠状态恢复)或委托给SurfaceView回调的surfaceCreated方法。在onPause方法中,我们的应用程序会删除预览回调,停止相机预览并释放相机。但是,我们的调查显示camera.release
方法有时需要30秒才能完成。在那30秒内,我们的应用程序被冻结,因为我们曾经从UI线程控制相机。后来我们将摄像机控件移动到单独的事件处理程序线程,现在camera.release
挂起该线程。虽然现在对用户来说这是不可见的(UI未被阻止),但是在我们的后台线程成功释放相机之前(即camera.release
被调用后30秒),用户无法使用任何应用中的相机。
在挂起期间,我们观察到来自摄像头服务的以下日志输出:
10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110)
10-21 16:09:14.453: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:14.453: E/Camera2-StreamingProcessor(122): deletePreviewStream: Error waiting for preview to drain: Connection timed out (-110)
10-21 16:09:24.573: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight
10-21 16:09:24.573: E/Camera2-CallbackProcessor(122): deleteStream: Error waiting for HAL to drain: Connection timed out (-110)
10-21 16:09:24.578: E/libexynosv4l2(122): failed to ioctl: VIDIOC_REQBUFS (-1 - Invalid argument)
10-21 16:09:24.578: E/ExynosCameraHAL2(122): cam_int_reqbufs: VIDIOC_REQBUFS (fd:35) failed (-1)
10-21 16:09:24.843: E/Camera2-CallbackProcessor(122): deleteStream: Camera 0: Device does not exist
10-21 16:09:24.853: E/Camera2-StreamingProcessor(122): deletePreviewStream: Camera 0: Device does not exist
您可以看到触发此行为的最小示例here - 需要快速重启相机活动几次,以增加进入此状态的机会。我们注意到它在我们的应用程序中比在示例应用程序中更频繁地出现。我们的应用程序做了一些繁重的帧处理,也使用GPU进行图像处理,除了相机还使用加速度计和方向传感器 - 所有这些都没有包含在示例应用程序中。
我们还看到了几个有关同一问题(question 1和question 2)的无法解答的StackOverflow问题。您能否解释一下代码路径将导致提到的日志输出以及如何避免进入该状态?
到目前为止,我们没有遇到任何其他设备上提到的相机冻结。
答案 0 :(得分:2)
不幸的是,您在Nexus 10相机HAL中遇到了一个非确定性错误。
虽然我们已经尝试反复追踪这个问题,但我们显然还没有找到所有问题。
就变通方法而言,您可以尝试简单地关闭相机设备,而无需删除回调并停止预览;没有必要分阶段进行关机。