Camera2 API中的Camera.PreviewCallback等价物

use*_*225 19 android yuv android-hardware android-camera android-5.0-lollipop

在API 21中的Camera2中是否有相同的Camera.PreviewCallback,比映射到SurfaceTexture并拉出位图更好?我需要能够以YUV的形式从相机中提取预览数据吗?

小智 15

您可以从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());
Run Code Online (Sandbox Code Playgroud)

之后,您可以在以下位置检索图像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());
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

为了得到一个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);
}
Run Code Online (Sandbox Code Playgroud)

  • 它冻结了Textureview。(mPreviewRequestBuilder.addTarget(mImageReader.getSurface());) (3认同)

Edd*_*ala 6

是的,使用ImageReader类.

使用格式ImageFormat.YUV_420_888和所需大小创建ImageReader(确保选择您正在使用的相机设备支持的大小).

然后使用ImageReader.getSurface()为Surface提供CameraDevice.createCaptureSession(),以及其他预览输出(如果有).

最后,在重复捕获请求中,将ImageReader提供的曲面添加为目标,然后再将其设置为捕获会话中的重复请求.