【问题标题】:Nexus 10 camera.release hangs for 30 secondsNexus 10 camera.release 挂起 30 秒
【发布时间】:2014-11-15 22:51:01
【问题描述】:

我们是一群致力于开发适用于 Android 的实时视频处理应用程序的开发人员。最近,一位客户报告说我们的应用程序冻结了,这种情况仅发生在 Nexus 10 设备上。我们自己购买了设备并进行了测试:

  • 设备预装了 Android 4.2 - 我们的应用没有挂起或死机
  • 在将 Android 升级到 4.3 后,我们的应用在关闭相机时卡住了(请参阅下面的说明)
  • 升级到 4.4 后,我们的应用一直冻结
  • 通过刷新最新的 Android 5.0 Nexus 10 出厂映像,我们的应用仍然卡住
  • (编辑) - 通过将 Nexus 10 升级到 Android 5.1 解决了该问题

有关冻结的更多信息:

我们的应用在活动的 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 进行图像处理,除了相机还使用加速度计和方向传感器 - 所有这些都未包含在示例应用程序中。

我们还看到了几个关于同一问题的未回答的 StackOverflow 问题(question 1question 2)。您能否解释一下什么代码路径会导致提到的日志输出以及如何避免进入该状态?

到目前为止,我们还没有在任何其他设备上遇到上述相机冻结问题。

【问题讨论】:

    标签: android camera freeze nexus-10


    【解决方案1】:

    很遗憾,您在 Nexus 10 相机 HAL 中遇到了一个不确定的错误。

    虽然我们已多次尝试追查此问题,但显然我们并未在此处找到所有问题实例。

    就解决方法而言,您可以尝试简单地关闭相机设备,而不删除回调并停止预览;不需要分阶段关闭。

    【讨论】:

    • 我尝试简单地释放相机设备,而不删除回调并停止预览,但是释放相机仍然需要 30 秒。我们现在将尝试使用 Camera2 API 实现我们的相机管理代码,希望这不会导致挂起...
    • 我们已在 L 版本的 N10 上修复了一些与此相关的问题,因此希望您会在 L 版本或后续更新之一中看到这一点更好。
    • 昨天我们的N10收到了Android 5.0.2更新,但是问题仍然没有解决。知道该修复程序应该在哪个版本中到达?
    • 我们将 N10 更新至 Android 5.1,该问题现已修复。非常感谢!
    • @EddyTalvala 您能否链接到可能已解决此问题的提交或错误票? 5.0.x 有解决方法吗?同样的错误发生在 Nexus 7 2013 上。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 2015-03-06
    • 2011-12-11
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多