我正在尝试使用camera2 API在预览期间获取视频帧数据帧。 如何获得指向每个帧数据的指针。 在此站点上显示帧预览之前,将帧数据指针与包含视频数据格式的结构一起发送到C ++函数(JNI本机)。 可能吗? 请给我一些建议帮助我? 我提前感谢。
答案 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);
请注意,这是伪代码以指导您,可能它还没有准备好直接粘贴和工作,但会为您提供有关如何继续的良好指导。