android camera工作流程

本文详细介绍了AndroidCamera2API的各个关键流程,包括打开与关闭相机、创建Session、预览、拍照和录像组件的选择与使用,以及SurfaceView、GLSurfaceView、TextureView和ImageReader等预览组件的特点和应用。
摘要由CSDN通过智能技术生成

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、关闭相机设备等。

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值