免费找客源软件,网站排名优化方法讲解,简答题网站建设步骤,网站建设 有哪些费用1. 相关的API
Android有三套关于摄像头的API(库)#xff0c;分别是Camera、Camera2和CameraX#xff0c;其中Camera已废弃#xff0c;在Android5.0以后推荐使用Camera2和CameraX#xff0c;Camera2推出是用来替换Camera的#xff0c;它拥有丰富的API可以为复杂的用例提供…1. 相关的API
Android有三套关于摄像头的API(库)分别是Camera、Camera2和CameraX其中Camera已废弃在Android5.0以后推荐使用Camera2和CameraXCamera2推出是用来替换Camera的它拥有丰富的API可以为复杂的用例提供深入的控制功能同样的它使用起来也相对麻烦。而CameraX是在Camera2基础上构建的更高层次的库旨在简化相机操作提供更方便的API降低学习曲线。
2. 选择使用场景
如果对相机的底层控制要求很高需要自定义功能、处理原始图像数据等那么 Camera2是一个更合适的选择如果想要更轻松地实现基本的相机功能降低开发难度CameraX 是一个更适合的选择。
3. CameraX简介
CameraX着重于用例它能支持下面常见用例
预览。使用PreviewView它是一种支持裁剪、缩放和旋转的view相机处于活动状态时图片预览会流式传输到它的surface。图片拍摄。提供自动白平衡、曝光、延迟、闪光灯和对焦等功能支持把图片放到内存缓存区和写文件。图像分析。应用会对每个帧运行analyze()方法可以进行图像处理、视觉或机器学习。可以通过设置阻塞和非阻塞的模式处理分析流水线无法满足CameraX帧率要求。视频拍摄。录制视频流和音频流对其压缩合并后写入磁盘。
CameraX不是本文重点此处不做详细介绍。
4. Camera2
4.1 设计架构 摄像头可以看做是数据源可以向摄像头注册多个业务流摄像头会把每帧的数据同时输出到每个流水线这些流水线可以并行对数据进行处理每个流水线可以有自己的输出格式传入的原始数据会通过每个与流水线相关联的隐士逻辑转换成相应的输出格式。摄像头需要使用CameraCaptureSession接受每个原始帧的帧配置CameraCaptureSession用来记录绑定到摄像头的所有流水线创建会话后无法添加或移除流水线。它会维持一个CaptureRequest队列这些队列会成为活跃配置。CaptureRequest会讲配置添加到队列选择一个或者多个可用的流水线从摄像头接收帧。
4.2 预览
下面我们写一段代码实现摄像头预览功能 // 创建接受相机帧的数据流(输出缓冲区)每一个数据流就是一个Surface对象我们要实现预览功能
// 就用UI中的SurfaceView中的Surface作为数据流这样相机帧数据直接传输到UI显示,
// 前面提到过可以同时支持多个数据流并行所以这里使用了list存储我们只预览放一个Surface就行了val targets listOf(fragmentCameraBinding.viewFinder.holder.surface)// 创建CameraCaptureSession, 这是自己封装的函数具体实现是调用的CameraDevice的函数
val session createCaptureSession(camera, targets, cameraHandler)// 创建CaptureRequest,里面设置了接受帧的数据流
val captureRequest camera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(fragmentCameraBinding.viewFinder.holder.surface) }//因为预览需要看到连续的图像所以需要这个请求重复调用
session.setRepeatingRequest(captureRequest.build(), null, cameraHandler)
上面的代码实现了预览功能基本包含了从相机获取数据流的基本功能如果我们想要拍照需要使用ImageReader可以看下面的例子。
4.3 拍照
//创建一个ImageReader
val imageReader ImageReader.newInstance(width, height, ImageFormat.JPEG, 3)//设置图片捕获后的回调
imageReader.setOnImageAvailableListener({ reader -val image reader.acquireNextImage() }, imageReaderHandler)//创建Session支持的数据流
val targets listOf(fragmentCameraBinding.viewFinder.holder.surface, imageReader.surface)//创建CameraCaptureSession
val session createCaptureSession(camera, targets, cameraHandler)//创建CaptureRequest
val captureRequest session.device.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE).apply { addTarget(imageReader.surface) }//单次请求
session.capture(captureRequest.build(), null, handler)
因为拍照只需要捕获一次图像就行了所以这里直接调用的capture()函数而上面预览需要持续捕获调用的是setRepeatingRequest()至于想要预览时支持点击拍照可以先调用重复捕获在调用单次捕获系统是支持交错捕获请求的。
4.4 视频
按照当前的框架录制视频也容易多了只需要添加一个新的数据流用来接收图像帧并且保存为视频文件就行了为了实现这个功能系统提供了两个比较好用的类MediaRecorder和MediaCodec。实际上MediaRecorder底层也是使用MediaCodec简单点说就是MediaRecorder简化了录制音视频的流程但是定制性相对较低如果需要对音视频处理进行定制可以使用MediaCodec。下面是简化后使用MediaRecorder的代码
TODO https://developer.android.com/training/camera2/capture-sessions-requests?hlzh-cn#kotlin https://github.com/android/camera-samples