Nexus 6使用camera2 API对焦速度缓慢

4
我遇到了Nexus 6上对焦缓慢的问题。我正在开发相机应用程序,现在我正在使用camera2 API。
为了应用程序的需要,我们创建了一个包含两个表面的预览请求: - SurfaceView(取景器) - YUV ImageReader surface(用于直方图计算中的数据)
这是一个关键点!如果只添加取景器表面,对焦就会正常进行。但是如果有这两个表面,对焦就会非常缓慢,而且会出现镜头移动的可视步骤!
代码相当标准,按照谷歌文档编写。
mImageReaderPreviewYUV = ImageReader.newInstance(previewWidth, previewHeight, ImageFormat.YUV_420_888, 2);


previewRequestBuilder = camDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(getCameraSurface()); //Add surface of SurfaceView
previewRequestBuilder.addTarget(mImageReaderPreviewYUV); //Add ImageReader

mCaptureSession.setRepeatingRequest(previewRequestBuilder.build(), captureCallback null);

你如何计算直方图?如果回调时间过长,可能会减慢相机的速度。我看到你为“mImageReaderPreviewYUV”指定了2个缓冲区 - 也许在保持这两个图像时焦点被卡住了? - Alex Cohn
直方图不会影响相机 - 已经为测试目的禁用。并且所有其他操作都已注释,以使捕获回调完全为空。缓冲区计数也减少到1。 - Grinchman
当缓冲区计数为1时,您实际上是告诉Android相机在捕获回调期间不要带来新的帧。您可以记录回调并尝试查看它们与自动对焦慢步骤之间是否存在相关性。 - Alex Cohn
2个回答

3
系统的logcat是否显示有关缓冲区不可用的警告? 预览帧率是否较慢,或者平稳(~30fps),但对焦工作异常?
如果是前者,您可能没有按照30fps的速度将Image对象返回给ImageReader(在使用完它们后关闭它们),因此相机设备无法维持30fps预览并且缺乏要填充的缓冲区。
为了测试这一点,请实现最小的ImageReaderListener.onImageAvailable(ImageReader reader)方法,该方法立即返回图像。
public class TestImageListener extends ImageReaderListener {
    public void onImageAvailable(ImageReader reader) {
        Image img = reader.acquireNextImage();
        img.close();
    }
  }
  ...
  mImageReaderPreviewYUV.setOnImageAvailableListener(new TestImageListener());

如果这使你得到流畅的预览,则说明您的图像处理速度过慢。作为解决方案,您应该增加ImageReader中的缓冲区数量,并且使用reader.acquireLatestImage()来删除旧缓冲区并仅在计算直方图时处理最新的图像。


1
谢谢回复!不,预览是流畅的,只是聚焦慢。我试图简化所有回调函数和摄像机管理逻辑-但没有成功。 - Grinchman
为了进一步检查,您使用哪种对焦模式?(默认为CONTINUOUS_PICTURE)您是手动触发自动对焦,还是让它被动对焦? - Eddy Talvala
我使用连续拍照模式,但是遇到了自动对焦问题。 - Grinchman
你们的输出分辨率和格式是什么?我们以前在N6上没有看到过这个,想知道这是否是一个bug。 - Eddy Talvala
SurfaceView:surfaceHolder.setFixedSize(1920, 1080); ImageReader:mImageReaderPreview = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 2);同时向Google的问题跟踪器提交了错误报告:https://code.google.com/p/android/issues/detail?id=95757&thanks=95757&ts=1421036143 - Grinchman

0

我在N6上也遇到了同样的问题,现在我认为它运行更加流畅 - 在相机表面之前添加ImageReader表面:

previewRequestBuilder = camDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(mImageReaderPreviewYUV); //Add ImageReader
previewRequestBuilder.addTarget(getCameraSurface()); //Add surface of SurfaceView

我也在N4/5.0.1上测试了我的相机应用程序,两种方式都完美运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接