如何在预览到Android Camera2 API期间获取指向每个帧数据的指针?

时间:2017-10-18 08:23:06

标签: android c++ frame preview android-camera2

我正在尝试使用camera2 API在预览期间获取视频帧数据帧。 如何获得指向每个帧数据的指针。 在此站点上显示帧预览之前,将帧数据指针与包含视频数据格式的结构一起发送到C ++函数(JNI本机)。 可能吗? 请给我一些建议帮助我? 我提前感谢。

1 个答案:

答案 0 :(得分:1)

关于从Java中预览获取帧,您可以在捕获中添加ImageReader。特别是,您需要使用ImageReader.OnImageAvailableListener (doc here)。从该ImageReader中,您可以使用类似于以下代码获取原始字节:

ImageReader.OnImageAvailableListener mOnImageAvailableListener =
        new ImageReader.OnImageAvailableListener() {

            @Override
            public void onImageAvailable(ImageReader reader) {
                Image img = null;
                img = reader.acquireLatestImage();
                Result rawResult = null;
                try {
                    if (img == null) throw new NullPointerException("cannot be null");
                    ByteBuffer buffer = img.getPlanes()[0].getBuffer();
                    byte[] data = new byte[buffer.remaining()];
                    buffer.get(data);

                    Bitmap b = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);

                } catch (ReaderException ignored) {                        
                } catch (NullPointerException ex) {
                } finally {
                    mQrReader.reset();
                    if (img != null)
                        img.close();
                }
            }
};

您必须创建ImageReader并设置其侦听器

mImageReader = ImageReader.newInstance(...);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, (...));

您可以通过以下方式添加到捕获会话中:

Surface surface = new Surface(texture);
Surface mImageSurface = mImageReader.getSurface();
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(mImageSurface);
mPreviewRequestBuilder.addTarget(surface);

请注意,这是伪代码以指导您,可能它还没有准备好直接粘贴和工作,但会为您提供有关如何继续的良好指导。