android-camera2相机开发-5-获取、处理预览帧数据
项目github地址
camera2 api 中使用 ImageReader
类间接获取预览帧数据。
ImageReader 使用之前,需要设置一个监听 OnImageAvailableListener
,在预览帧可用时会被回调,在回调方法中可以接收到预览帧,并实现具体的处理逻辑。
然后,获取 ImageReader 的 Surface ,在创建相机捕获会话时,添加进去作为输出Sruface。
【android-camera2相机开发-5-获取、处理预览帧数据】最后,构建捕获请求时,需要将 ImageReader 的 Surface 添加进去。
相机使用完关闭时,需要将 ImageReader 也关闭。
//获取 ImageReader 和 surface
//前三个参数分别是需要的尺寸和格式,最后一个参数代表每次最多获取几帧数据,本例的2代表ImageReader中最多可以获取两帧图像流
previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), ImageFormat.JPEG, 2);
previewReader.setOnImageAvailableListener(
new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
//获取预览帧数据
Image image = reader.acquireLatestImage();
//处理逻辑
if (image != null){
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] data = https://www.it610.com/article/new byte[buffer.remaining()];
Log.d(TAG,"data-size=" + data.length);
buffer.get(data);
image.close();
}
}
},
null);
//获取 ImageReader 的 Surface
final Surface readerSurface = previewReader.getSurface();
//预览帧数据会同时输出到 previewSurface,readerSurface
cameraDevice.createCaptureSession(Arrays.asList(previewSurface, readerSurface),
new CameraCaptureSession.StateCallback() {
……
});
//构建预览捕获请求时,添加 readerSurface
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(readerSurface);
//释放ImageReader资源
if (previewReader != null){
previewReader.close();
previewReader = null;
}
推荐阅读
- 深入理解Go之generate
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 我的软件测试开发工程师书单
- echart|echart 双轴图开发
- NPDP拆书(三)(新产品开发战略(经营与创新战略))
- 芯灵思SinlinxA33开发板Linux内核定时器编程
- 常用git命令总结
- 藏族开发的修路人——记致富援乡的斯定那珠
- ASP.NET|ASP.NET Core应用开发思维导图
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)