如何在 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);
请注意,这是指导您的伪代码,可能还不能直接粘贴和工作,但会为您提供有关如何继续操作的良好指导。
我正在尝试使用 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);
请注意,这是指导您的伪代码,可能还不能直接粘贴和工作,但会为您提供有关如何继续操作的良好指导。