Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?
Posted
技术标签:
【中文标题】Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?【英文标题】:Camera.release() takes 30 seconds to release the camera in Nexus 10. Is there any way to speed up the process?Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有什么方法可以加快这个过程吗? 【发布时间】:2014-02-14 22:59:57 【问题描述】:我正在使用以下代码在 onPause 中释放相机。但是 mCamera.release() 行平均需要 30 秒才能释放 Nexus 10 设备中的相机。我在 mCamera.release() 前后添加了日志,发现打印这些日志的时间差是 30 秒。
private void releaseCamera()
if (mCamera != null)
previewing = false;
mCamera.setPreviewCallback(null);
if(mPreview != null)
mPreview.getHolder().removeCallback(mPreview);
Log.e("QR","Starting to call mCamera.release()");
mCamera.release();
Log.e("QR","Released Camera");
mCamera = null;
我在调用 releaseCamera() 之前调用 mCamera.stopPreview()
有什么方法可以异步进行吗?因为从 Camerapreview 活动到下一个活动只需不到一分钟。
Edit1:我们将预览尺寸从最高 (1080x1920) 减小到中等范围 (480x800),一切开始正常。预览大小是否与 HAL 中的相机版本有关?
【问题讨论】:
我在我的应用程序中创建了许多线程。是不是造成了问题?如果是这样,我如何在不生根设备的情况下进行检查? 将预览大小从 (1080,1920) 减小到较小的大小,例如 (480,800),性能会发生一些显着变化。 Camera.release() 与预览大小有关系吗?如果释放相机有延迟,所花费的时间几乎是一个常数——Nexus 10 是 320 毫秒或 30 秒——这背后的原因是什么? 你在打电话给mCamera.stopPreview()
吗?
您是否在其他应用中看到过类似问题? Grafika (github.com/google/grafika) 有一些基于相机的活动,例如“show + capture camera”,我经常在 Nexus 10 上运行它。你是从 onPause() 调用这个吗?在此期间,logcat 中是否有任何看起来与相机相关的内容?
如果您查看 Camera2 API (github.com/android/platform_hardware_libhardware/blob/master/…) 的代码,第 284 行,您会看到您在应用程序中看到的堆栈跟踪错误。似乎 HAL 正在等待相机上的所有操作完成后再关闭它,并且某些东西阻止了您的释放。在释放超时(我猜是 30 秒)时,HAL 断开连接。这段代码中有一行很有趣: // TODO: 设置来自 HAL 的通知,而不是在这里休眠。这可能是 nexus 10 上未实现的...
【参考方案1】:
您可以尝试在线程内释放相机作为解决方法,但这不是一个理想的解决方案。您可以在后台执行发布功能时启动您的下一个活动
new AsyncTask()
@Override
protected Object doInBackground(Object... params)
releaseCamera();
return null;
;
.execute();
【讨论】:
我们使用该解决方法。然而,如果相机需要再次打开,用户将无法这样做,这并不理想。【参考方案2】:Dilip,这是 Nexus 10 中的已知问题,请查看此Nexus 10 camera.release hangs for 30 seconds。
我们尝试过这些东西,
camera.stopPreview();
camera.setPreviewCallback(null);
camera.unlock();
camera.release();
camera = null;
它对我有用,但我也必须在其他设备上测试相同的代码(最好将上面的代码放在 try/catch 语句中)。
另外,您可以在线程中添加此功能:
new Thread(new Runnable()
public void run()
camera.stopPreview();
camera.setPreviewCallback(null);
camera.unlock();
camera.release();
camera = null;
).start();
尝试使用Camera2 API创建相机管理代码,希望这不会造成问题,检查这个http://blog.csdn.net/torvalbill/article/details/40376145
【讨论】:
建议在 Nexus 10 上不起作用。我们正在寻找可行的解决方案或变通方法。 @ssasa 我们发现,如果您没有正确打开和关闭这些错误,则这些错误会在 nexus 中发生,一段时间后它就会成为一个问题。这就是原因,我提供了我们用于正确关闭相机的脚本,而且,我们正在实施本周的相机 2 API。也许,到这个周末,我可以对此发表评论。【参考方案3】:我不需要声誉级别来添加评论,所以我会把它放在这里:
new Thread(new Runnable()
public void run()
camera.stopPreview();
camera.setPreviewCallback(null);
camera.unlock();
camera.release();
camera = null;
).start();
当发布调用将在单独的线程中运行时,它将导致其他使用相机的应用程序出现问题,并将在此基础上启动。 我也在寻找解决方案。我没有Nexus10。我们有自己的设备。
【讨论】:
以上是关于Camera.release() 在 Nexus 10 中释放相机需要 30 秒。有啥方法可以加快这个过程吗?的主要内容,如果未能解决你的问题,请参考以下文章