是否有来自API 21的Camera2中Camera.PreviewCallback的等效物,比映射到SurfaceTexture并拉出位图更好?我需要能够将预览数据作为YUV从相机中拉出来吗?
答案 0 :(得分:13)
您可以从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());
}
}
};
从Bitmap
获取ByteBuffer
:
Bitmap fromByteBuffer(ByteBuffer buffer) {
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes, 0, bytes.length);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
答案 1 :(得分:5)
是的,请使用ImageReader课程。
使用ImageFormat.YUV_420_888格式和所需尺寸创建ImageReader(确保选择您正在使用的相机设备支持的尺寸)。
然后使用ImageReader.getSurface()为Surface提供CameraDevice.createCaptureSession(),以及其他预览输出(如果有的话)。
最后,在重复捕获请求中,将ImageReader提供的曲面添加为目标,然后再将其设置为捕获会话中的重复请求。