android camera工作流程
camera 架构
相机使用流程
-
Android Camera2 Open/Close Camera流程
-
Android Camera2 创建Session流程
预览组件:SurfaceView、GLSurfaceView、TextureView 拍照组件:ImageReader 录像组件:MediaRecorder、MediaCodec
-
Android Camera2 创建CaptureRequest流程
-
Android Camera2 预览(启动、停止)流程
-
Android Camera2 拍照流程
-
Android Camera2 录像流程
打开相机流程:
-
获取CameraManager实例:首先,需要通过系统服务获取CameraManager的实例,通常可以通过getSystemService(Context.CAMERA_SERVICE)来获取。
-
获取相机ID列表:通过CameraManager实例,可以获取当前设备上的相机列表,即相机ID列表。
-
选择相机ID并打开相机:根据需求选择要打开的相机ID,并通过CameraManager的openCamera()方法打开相机。在此过程中,需要实现CameraDevice.StateCallback来处理相机打开成功或失败的回调。
-
配置相机预览:在相机打开成功后,需要配置相机的各种参数,设置预览尺寸、拍照尺寸、对焦模式等参数。
-
创建预览会话:最后,通过创建CaptureSession来进行预览显示,通常会将预览的Surface设置到CaptureRequest.Builder中,并启动预览会话。
关闭相机流程:
-
停止预览:在关闭相机之前,需要先停止当前的预览会话,释放预览相关的资源。
-
关闭相机:通过调用CameraDevice的close()方法来关闭相机,释放相机相关的资源。
Android Camera2 创建Session流程
-
创建会话的输出 Surface:首先,你需要创建一个用于接收相机图像数据的 Surface 对象。这通常是一个 SurfaceTexture 或者是一个 SurfaceView 的 Surface。
-
配置 CaptureRequest:接着,你需要创建一个 CaptureRequest 对象,该对象包含了相机的配置信息,比如预览尺寸、对焦模式等。
-
设置会话的状态回调:为了处理会话状态的变化,你需要实现 CameraCaptureSession.StateCallback 接口,该接口包括了会话创建成功、会话关闭等状态的回调方法。
-
创建会话:通过调用 CameraDevice.createCaptureSession() 方法,传入输出 Surface 和 StateCallback 对象,来创建相机会话。在会话创建成功时,会回调 onConfigured 方法,在这个回调中可以获取到 CameraCaptureSession 对象。
-
设置 CaptureRequest 和启动预览:一旦会话创建成功,你可以通过 CameraCaptureSession.setRepeatingRequest() 方法来发送 CaptureRequest 并启动预览。这样相机就会不断地发送图像数据到输出 Surface 进行预览。
预览组件:SurfaceView、GLSurfaceView、TextureView
SurfaceView、GLSurfaceView 和 TextureView 是 Android 中用于显示图像内容的预览组件,它们各有特点和适用场景:
SurfaceView:
- SurfaceView 是一个在自己的窗口中绘制自己的表面的 View。
- SurfaceView 位于窗口层级的底部,可以通过 SurfaceHolder 来控制其绘制的 Surface 的格式和大小等属性。
- SurfaceView 适合用于需要在后台线程中绘制图像的情况,比如相机预览、视频播放等。
GLSurfaceView:
- GLSurfaceView 是继承自 SurfaceView 的,专门用于 OpenGL ES 渲染的 View。
- GLSurfaceView 封装了 OpenGL ES 的渲染和上下文管理,方便开发者使用 OpenGL 进行图形渲染。
- GLSurfaceView 适合用于需要高性能 3D 图形渲染的应用,比如游戏、模拟器等。
TextureView:
- TextureView 是一个可用于硬件加速的 View,可以用来显示可以从相机、视频解码器等获取到的 SurfaceTexture 数据。
- TextureView 可以在 UI 线程中直接操作,支持动画、缩放、旋转等操作,并且支持 alpha、mask 等特性。
- TextureView 适合用于实时视频预览、实时滤镜处理等需要实时更新纹理的场景。
根据不同的需求和应用场景,可以选择合适的预览组件来展示图像内容。SurfaceView 适合于后台线程的绘制,GLSurfaceView 适合于高性能的 OpenGL 渲染,而 TextureView 则适合于实时更新纹理数据的场景。
拍照组件:ImageReader
在 Android 相机开发中,ImageReader 是一个用于获取相机拍摄的图像数据的类。它提供了一种异步方式来获取相机捕获的图像,通常用于实现拍照功能。以下是 ImageReader 的一些特点和用法:
特点:
- 提供了获取相机图像数据的高效方式,可以获取原始的图像数据。
- 支持设置图像数据的格式、大小等参数。
- 可以通过监听器方式获取到相机捕获的每一帧图像数据。
用法:
- 创建 ImageReader 实例:可以通过 ImageReader.newInstance() 方法创建一个 ImageReader 实例,指定图像的宽度、高度、格式等参数。
- 设置监听器:通过 ImageReader.setOnImageAvailableListener() 方法设置一个监听器,当有新的图像可用时会触发监听器回调。
- 获取图像数据:在监听器回调中,可以通过 ImageReader.acquireNextImage() 或 ImageReader.acquireLatestImage() 方法获取到 Image 对象,从而获取图像数据进行处理。
使用 ImageReader 可以方便地获取相机捕获的图像数据,实现拍照功能或者其他需要处理相机图像的场景。记得在使用完毕后及时释放资源,避免内存泄漏。
录像组件:MediaRecorder、MediaCodec
在 Android 平台上,要实现录像功能通常会使用到 MediaRecorder 和 MediaCodec 这两个组件。
MediaRecorder:
- MediaRecorder 是一个高层次的多媒体录制类,提供了简单易用的接口来录制音频和视频。
- 使用 MediaRecorder 可以轻松地实现基本的音视频录制功能,包括设置音视频来源、输出格式、编码器等参数。
- 通过 MediaRecorder 提供的方法可以方便地开始录制、停止录制,并且得到录制后的多媒体文件。
MediaCodec:
- MediaCodec 是 Android 提供的低层次的多媒体编解码器类,它可以用于对音视频进行编解码处理。
- 使用 MediaCodec 可以更加灵活地控制音视频的编码和解码过程,包括选择特定的编码器、自定义编码参数等。
- MediaCodec 适合于对音视频进行更加复杂和定制化的处理,比如实时滤镜处理、特效添加等。
Android Camera2 创建CaptureRequest流程
在 Android 相机开发中使用 Camera2 API 创建 CaptureRequest 的流程通常包括以下步骤:
-
获取 CameraManager 实例:
首先需要获取系统的 CameraManager 实例,可以通过 getSystemService(Context.CAMERA_SERVICE) 方法获取。
-
选择相机设备:
使用 CameraManager 的 getCameraIdList() 方法获取可用的相机设备列表,选择需要的相机设备的 ID。
-
打开相机设备:
使用 CameraManager 的 openCamera() 方法打开选择的相机设备,传入相机设备的 ID 和一个 CameraDevice.StateCallback 对象。
-
创建 CameraCaptureSession:
在 CameraDevice.StateCallback 的 onOpened() 回调中,创建一个 CameraCaptureSession 对象,通过 CameraDevice 的 createCaptureSession() 方法实现。
-
创建 CaptureRequest:
在 CameraCaptureSession 的回调中,比如 onConfigured() 回调中,创建一个 CaptureRequest 对象,可以通过 CameraDevice 的 createCaptureRequest() 方法创建。
-
配置 CaptureRequest:
配置 CaptureRequest 对象,比如设置图像格式、分辨率、对焦模式、曝光等参数,以及添加 Surface 作为数据的输出目标。
-
发送 CaptureRequest:
最后,使用 CameraCaptureSession 的 setRepeatingRequest() 或 capture() 方法发送配置好的 CaptureRequest 请求,开始捕获图像数据。
Android Camera2 预览(启动、停止)流程
在 Android 相机开发中,使用 Camera2 API 实现预览的启动和停止通常涉及以下步骤:
启动预览流程:
-
获取 CameraManager 实例:
首先需要获取系统的 CameraManager 实例,可以通过 getSystemService(Context.CAMERA_SERVICE) 方法获取。
-
选择相机设备:
使用 CameraManager 的 getCameraIdList() 方法获取可用的相机设备列表,选择需要的相机设备的 ID。
-
打开相机设备:
使用 CameraManager 的 openCamera() 方法打开选择的相机设备,传入相机设备的 ID 和一个 CameraDevice.StateCallback 对象。
-
创建 CaptureRequest 和 CameraCaptureSession:
在 CameraDevice.StateCallback 的 onOpened() 回调中,创建一个 CameraCaptureSession 对象,通过 CameraDevice 的 createCaptureSession() 方法实现。同时,创建预览的 CaptureRequest 对象,配置预览的参数和目标 Surface。
-
设置预览显示的 Surface:
将预览数据输出到一个 Surface 对象上,通常是 SurfaceView、TextureView 或者 ImageReader。
-
发送预览请求:
最后,在 CameraCaptureSession 的回调中,通过 setRepeatingRequest() 方法发送配置好的预览 CaptureRequest 请求,开始预览相机捕获的图像数据。
停止预览流程:
-
停止预览请求:
调用 CameraCaptureSession 的 stopRepeating() 方法停止预览请求。
-
关闭 CameraCaptureSession:
调用 CameraCaptureSession 的 close() 方法关闭预览会话。
-
关闭相机设备:
调用 CameraDevice 的 close() 方法关闭相机设备。
Android Camera2 拍照流程
在 Android 相机开发中,使用 Camera2 API 实现拍照的流程通常包括以下步骤:
-
获取 CameraManager 实例:
首先需要获取系统的 CameraManager 实例,可以通过 getSystemService(Context.CAMERA_SERVICE) 方法获取。
-
选择相机设备:
使用 CameraManager 的 getCameraIdList() 方法获取可用的相机设备列表,选择需要的相机设备的 ID。
-
打开相机设备:
使用 CameraManager 的 openCamera() 方法打开选择的相机设备,传入相机设备的 ID 和一个 CameraDevice.StateCallback 对象。
-
创建 CaptureRequest 和 CameraCaptureSession:
在 CameraDevice.StateCallback 的 onOpened() 回调中,创建一个 CameraCaptureSession 对象,通过 CameraDevice 的 createCaptureSession() 方法实现。同时,创建用于拍照的 CaptureRequest 对象,配置拍照的参数和目标 Surface。
-
设置拍照目标 Surface:
将拍照数据输出到一个 Surface 对象上,通常是 ImageReader,用于获取拍摄的图片数据。
-
发送拍照请求:
在 CameraCaptureSession 的回调中,通过 capture() 方法发送配置好的拍照 CaptureRequest 请求,开始拍照并将结果保存到设置的目标 Surface 中。
-
处理拍照结果:
在 CameraCaptureSession 的回调中,可以监听拍照结果的回调,获取拍照的图片数据,并进行后续的处理,比如保存到文件或展示在界面上。
-
释放资源:
在完成拍照后,需要释放相关资源,包括关闭 CameraCaptureSession、关闭 ImageReader、关闭相机设备等。
Android Camera2 录像流程
在 Android 相机开发中,使用 Camera2 API 实现录像的流程通常包括以下步骤:
-
获取 CameraManager 实例:
首先需要获取系统的 CameraManager 实例,可以通过 getSystemService(Context.CAMERA_SERVICE) 方法获取。
-
选择相机设备:
使用 CameraManager 的 getCameraIdList() 方法获取可用的相机设备列表,选择需要的相机设备的 ID。
-
打开相机设备:
使用 CameraManager 的 openCamera() 方法打开选择的相机设备,传入相机设备的 ID 和一个 CameraDevice.StateCallback 对象。
-
创建 CaptureRequest 和 CameraCaptureSession:
在 CameraDevice.StateCallback 的 onOpened() 回调中,创建一个 CameraCaptureSession 对象,通过 CameraDevice 的 createCaptureSession() 方法实现。同时,创建用于录像的 CaptureRequest 对象,配置录像的参数和目标 Surface。
-
设置录像目标 Surface:
将录像数据输出到一个 Surface 对象上,通常是 MediaRecorder 或者 MediaCodec 的 Surface。
-
开始录像:
在 CameraCaptureSession 的回调中,通过 setRepeatingRequest() 方法发送配置好的录像 CaptureRequest 请求,开始录像。
-
停止录像:
当录像完成或者用户停止录像时,调用 CameraCaptureSession 的 stopRepeating() 方法停止录像请求。
-
释放资源:
在完成录像后,需要释放相关资源,包括关闭 CameraCaptureSession、关闭相机设备等。
-
-
-
-
-
-
-
-