Camera2 API 中的 Camera.PreviewCallback 等效项
Posted
技术标签:
【中文标题】Camera2 API 中的 Camera.PreviewCallback 等效项【英文标题】:Camera.PreviewCallback equivalent in Camera2 API 【发布时间】:2015-04-11 00:17:43 【问题描述】:API 21 中的 Camera2 中的 Camera.PreviewCallback 是否有任何等效项,比映射到 SurfaceTexture 并拉取 Bitmap 更好?我需要能够将预览数据从相机中提取为 YUV?
【问题讨论】:
【参考方案1】:您可以从 Google 的 Camera2Basic 示例代码开始。
您需要将ImageReader
的表面作为目标添加到预览捕获请求中:
//set up a CaptureRequest.Builder with the output Surface
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
之后,您可以在ImageReader.OnImageAvailableListener
中检索图像:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener()
@Override
public void onImageAvailable(ImageReader reader)
Image image = null;
try
image = reader.acquireLatestImage();
if (image != null)
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
Bitmap bitmap = fromByteBuffer(buffer);
image.close();
catch (Exception e)
Log.w(LOG_TAG, e.getMessage());
;
从ByteBuffer
获取Bitmap
:
Bitmap fromByteBuffer(ByteBuffer buffer)
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes, 0, bytes.length);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
【讨论】:
它冻结了 Textureview。 (mPreviewRequestBuilder.addTarget(mImageReader.getSurface());)【参考方案2】:是的,使用ImageReader 类。
使用 ImageFormat.YUV_420_888 格式和您想要的尺寸创建一个 ImageReader(确保您选择的尺寸受您使用的相机设备支持)。
然后使用 ImageReader.getSurface() 将 Surface 与其他预览输出(如果有)一起提供给 CameraDevice.createCaptureSession()。
最后,在您的重复捕获请求中,将 ImageReader 提供的表面添加为目标,然后再将其设置为捕获会话中的重复请求。
【讨论】:
@ Eddy Talvala,当我添加像 mPreviewRequestBuilder.addTarget(mImageReader.getSurface()); 这样的目标时它冻结了表面。 您在 logcat 中遇到什么错误?您是否将表面添加到您的 createCaptureSession 调用中? 是的,在 createCaptureSession 中设置输出的两个表面。 Logcat 没有显示任何错误。它直接锁定,但从前两天卡住了。 logcat :- 等待请求完成时超时。它只向 ImageReader Callback 发送三个请求。 在处理完每个图像后是否调用 image.close()?否则,您将耗尽相机以获取免费缓冲区。以上是关于Camera2 API 中的 Camera.PreviewCallback 等效项的主要内容,如果未能解决你的问题,请参考以下文章
如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?
如何使用Android中的Camera2 API在不预览的情况下拍摄多张照片?
Camera2用Android API 29中的两个物理流替换一个逻辑流
横向模式下的预览方向使用 Camera2 api 顺时针旋转
调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback