Android 基于Camera2 API举行摄像机图像预览

[复制链接]
发表于 2025-12-20 03:44:08 | 显示全部楼层 |阅读模式

媒介

近期博主准备编写一个基于Android Camera2的图像收罗并编码为h.264的应用,准备分为三个阶段来完成,第一阶段实现Camera2的摄像机预览,第二阶段完成基于MediaCodec H.264编码,第三阶段完成基于MediaCodec H.264解码,针对差别阶段将输出对应的实现博文,由于笔者是第一次打仗这块因此如果编写过程中有什么错误的话,欢迎各人指正,对于技能方面感爱好的也欢迎私信大概留言,一起讨论共同进步。
Camera2 API简介

Android Camera2 API 是从 Android 5.0(Lollipop)开始引入的,用以代替旧的 Camera API。Camera2 提供了更强盛和机动的相机控制本领,允许开辟者实现更多的相机功能,如手动对焦、手动曝光、原生 RAW 图像捕获等。
在开始使用Camera2之前,我们先来相识下Camera2使用过程中必要用到的干系类:

      
  • CameraManager:相机管理器,安卓体系针对差别的功能模块会创建差别的Manager,以是相机也不例外,一样平常重要用来open相机大概查询相机列表以及对应相机的参数等。
      
  • CameraDevice:代表一个物理相机装备,可以打开、设置和关闭相机装备等。
      
  • CameraCaptureSession:相机捕获会话,用于发送捕获哀求和吸收捕获结果,可以预览、照相、录像等。
      
  • CameraCharacteristics:提供了相机装备的静态信息,如支持的参数、分辨率、对焦模式等。

整个实验流程大抵上如下:
  1. flowchart TB
  2.     获取CameraManager对象 --> 通过CameraManager打开指定ID的相机 --> 打开后拿到到CameraDevice对象 --> 通过CameraDevice创建CameraCaptureSession对象 --> 通过CameraCaptureSession开启预览
复制代码

现在已经简朴的知晓了干系类的用途和流程,那么我们接下来开始实现Camera2的预览功能
编码实现

为了方便后续对这块的复用,因此这里我们创建一个名为CameraWrapper的类,用以对Camera干系功能的封装,起首添加如下代码
  1. class CameraWrapper(private var context:Context) {
  2.    
  3.    
  4.     private val TAG = "CameraWrapper"
  5.     private var cameraManager: CameraManager
  6.     private var cameraDevice: CameraDevice? = null
  7.     private var characteristics: CameraCharacteristics? = null
  8.     private var session: CameraCaptureSession? = null
  9.     //当前设备的相机列表
  10.     private var cameraIds:Array<String>
  11.     //默认启用的cameraId
  12.     private var cameraId:String = "0"//默认前置
  13.     private var previewView:SurfaceView? = null
  14.     private  var encoderSurface: Surface? = null
  15.     private var cameraThread:HandlerThread = HandlerThread("CameraThread")
  16.     private var cameraHandler: Handler
  17.     private var previewSize:Size? = Size(1280,720)
  18.    
  19.     init {
  20.    
  21.    
  22.         cameraThread.start()
  23.         cameraHandler = Handler(cameraThread.looper)
  24.         cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
  25.         cameraIds = getCameraIds()
  26.         //看下id和前后置的对应关系
  27.         for(id in cameraIds){
  28.    
  29.    
  30.             Log.d(TAG,"id : "+id+"---"+getCameraOrientationString(id))
  31.         }
  32.          useCamera(cameraId)
  33.     }
复制代码
这里我们界说了全部必要用到的成员变量,这里我挑几个分析下,其他的就不外多分析确,看名字应该都能明确。
通过previewView应该不丢脸出我们使用的预览View为SurfaceView。
encoderSurface这个预留给后续摄像机编码H.264时使用,本篇文章暂未用到。
cameraThread和cameraHandler这里可以不消过多关注,创建的意义重要是传参给Camera,使用是在Camera内。
previewSize可以明确为预览的画面分辨率,默认设置的是720P。
该类类创建时,获取到了装备支持的摄像机列表并打印了前后置的对应关系,这里重要是调试观察的。getCameraIds()和 useCamera(cameraId)我们还没实现,但是先不急,让我们先加两个权限干系的函数。
  1.    //添加权限请求和检查接口,方便使用
  2.     companion object{
  3.    
  4.    
  5.          fun requestCameraPermissions(activity: Activity){
  6.    
  7.    
  8.             ActivityCompat.requestPermissions(
  9.                 activity,
  10.                 arrayOf(
  11.                     Manifest.permission.CAMERA,
  12.                 ),
  13.                 998
  14.             )
  15.         }
  16.         fun checkCameraPermission(context: Context):Boolean{
  17.    
  18.    
  19.             return ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
  20.         }
  21.     }
复制代码
这两个函数作用就不表明了,焦点作用就是为了方便使用CameraWrapper时对干系权限举行查抄和哀求。
  1. fun useCamera(id:String){
  2.    
  3.    
  4.         cameraId = id
  5.         try {
  6.    
  7.    
  8.             characteristics = cameraManager.getCameraCharacteristics(cameraId
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表