【问题标题】:Slow focusing on Nexus 6 with camera2 API使用 camera2 API 缓慢关注 Nexus 6
【发布时间】:2014-12-28 06:50:19
【问题描述】:

我遇到了关注 Nexus 6 缓慢的问题。 我开发相机应用程序,现在我正在使用 camera2 API。

针对应用需求,我们创建具有 2 个表面的预览请求 - SurfaceView(取景器) - YUV ImageReader 表面(在直方图计算中使用数据)

还有一个关键点!如果仅添加取景器表面,则对焦会正常进行。但是对于 2,随着镜头移动的视觉步骤,这些表面聚焦发生得非常缓慢!

代码非常标准,根据谷歌文档编写:

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 个缓冲区 - 也许在您持有这两个图像时焦点卡住了?
  • 直方图不影响相机 - 出于测试目的已禁用。并且对所有其他操作进行了注释,以使捕获回调绝对为空。缓冲区的数量也减少到 1。
  • 当缓冲区计数为 1 时,您实质上是在告诉 Android 相机在捕获回调时不要带来新帧。您可以记录回调并尝试查看它们与自动对焦慢步之间是否存在相关性。

标签: android android-camera android-5.0-lollipop


【解决方案1】:

系统 logcat 是否显示任何有关缓冲区不可用的警告? 预览帧速率是慢还是流畅(~30fps)但对焦却很奇怪?

如果是前者,您可能不会以 30 fps 的速度将 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() 删除较旧的缓冲区,并且每次计算直方图时只处理最新的图像。

【讨论】:

  • 感谢您的回复!不,预览很流畅,只是对焦缓慢。我试图简化所有回调和相机的管理逻辑 - 没有运气(
  • 要检查更多内容,您使用的是哪种对焦模式? (默认为 CONTINUOUS_PICTURE)你是触发 AF,还是让它被动对焦?
  • 我使用的是 CONTINUOUS_PICTURE,但同样有 AF 问题。
  • 您的输出是什么分辨率和格式?我们以前在 N6 上没有看到过这个,想看看这是否是一个错误。
  • SurfaceView:surfaceHolder.setFixedSize(1920, 1080); ImageReader: mImageReaderPreview = ImageReader.newInstance(1920, 1080, ImageFormat.YUV_420_888, 2);还向谷歌的问题跟踪器提交了一个错误报告:code.google.com/p/android/issues/…
【解决方案2】:

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

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

我还使用 N4/5.0.1 测试了我的相机应用,两种方式都可以完美运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多