我在Nexus6上遇到了关注速度慢的问题。我开发了相机应用程序,现在我正在使用camera2应用程序接口。
对于应用程序的需要,我们创建了两个表面的预览请求- SurfaceView (取景器)- YUV ImageReader表面(在hstogram计算中使用数据)
这是一个临界点!如果只添加取景器表面,聚焦就会正常发生。但是对于2,这些表面聚焦发生得非常慢,因为镜头的视觉步幅在移动!
代码非常标准,是根据google文档编写的:
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);发布于 2015-01-08 07:06:19
系统logcat是否显示任何有关缓冲区不可用的警告?是预览帧速率慢,还是流畅(~30fps),但对焦的效果很奇怪?
如果是前者,您可能无法以30 fps的速度将图像对象返回到ImageReader (通过关闭它们),因此摄影机设备将无法填充缓冲区,并且无法保持30fps的预览。
要测试这一点,请实现最小的ImageReaderListener.onImageAvailable(ImageReader阅读器方法,该方法仅立即返回图像:
public class TestImageListener extends ImageReaderListener {
public void onImageAvailable(ImageReader reader) {
Image img = reader.acquireNextImage();
img.close();
}
}
...
mImageReaderPreviewYUV.setOnImageAvailableListener(new TestImageListener());如果这让你得到了流畅的预览,那么你的图像处理就太慢了。作为解决方案,您应该增加ImageReader中的缓冲区数量,并使用reader.acquireLatestImage()删除较旧的缓冲区,并在每次计算直方图时仅处理最新的图像。
发布于 2015-01-28 15:21:47
我在N6上遇到了同样的问题,我认为它现在工作得更流畅了-在摄像头表面之前添加ImageReader表面:
previewRequestBuilder = camDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
previewRequestBuilder.addTarget(mImageReaderPreviewYUV); //Add ImageReader
previewRequestBuilder.addTarget(getCameraSurface()); //Add surface of SurfaceView我还用N4/5.0.1测试了我的相机应用程序,这两种方式在那里都能完美地工作。
https://stackoverflow.com/questions/27674282
复制相似问题