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

How to get a pointer to each frame data during preview into Android Camera2 API?

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

关于在 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);

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