简体   繁体   English

Camera2 API中的Camera.PreviewCallback等价物

[英]Camera.PreviewCallback equivalent in Camera2 API

Is there any equivalent for Camera.PreviewCallback in Camera2 from API 21,better than mapping to a SurfaceTexture and pulling a Bitmap ? 在API 21中的Camera2中是否有相同的Camera.PreviewCallback,比映射到SurfaceTexture并拉出位图更好? I need to be able to pull preview data off of the camera as YUV? 我需要能够以YUV的形式从相机中提取预览数据吗?

You can start from the Camera2Basic sample code from Google. 您可以从Google的Camera2Basic示例代码开始。

You need to add the surface of the ImageReader as a target to the preview capture request: 您需要将ImageReader的表面添加为预览捕获请求的目标:

//set up a CaptureRequest.Builder with the output Surface
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

After that, you can retrieve the image in the ImageReader.OnImageAvailableListener : 之后,您可以在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());
        }
    }
};

To get a Bitmap from the ByteBuffer : 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);
}

Yes, use the ImageReader class. 是的,使用ImageReader类。

Create an ImageReader using the format ImageFormat.YUV_420_888 and your desired size (make sure you select a size that's supported by the camera device you're using). 使用格式ImageFormat.YUV_420_888和所需大小创建ImageReader(确保选择您正在使用的相机设备支持的大小)。

Then use ImageReader.getSurface() for a Surface to provide to CameraDevice.createCaptureSession(), along with your other preview outputs, if any. 然后使用ImageReader.getSurface()为Surface提供CameraDevice.createCaptureSession(),以及其他预览输出(如果有)。

Finally, in your repeating capture request, add the ImageReader provided surface as a target before setting it as the repeating request in your capture session. 最后,在重复捕获请求中,将ImageReader提供的曲面添加为目标,然后再将其设置为捕获会话中的重复请求。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM