媒介
近期博主准备编写一个基于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:提供了相机装备的静态信息,如支持的参数、分辨率、对焦模式等。
整个实验流程大抵上如下:
- flowchart TB
- 获取CameraManager对象 --> 通过CameraManager打开指定ID的相机 --> 打开后拿到到CameraDevice对象 --> 通过CameraDevice创建CameraCaptureSession对象 --> 通过CameraCaptureSession开启预览
复制代码
现在已经简朴的知晓了干系类的用途和流程,那么我们接下来开始实现Camera2的预览功能。
编码实现
为了方便后续对这块的复用,因此这里我们创建一个名为CameraWrapper的类,用以对Camera干系功能的封装,起首添加如下代码:
- class CameraWrapper(private var context:Context) {
-
-
- private val TAG = "CameraWrapper"
- private var cameraManager: CameraManager
- private var cameraDevice: CameraDevice? = null
- private var characteristics: CameraCharacteristics? = null
- private var session: CameraCaptureSession? = null
- //当前设备的相机列表
- private var cameraIds:Array<String>
- //默认启用的cameraId
- private var cameraId:String = "0"//默认前置
- private var previewView:SurfaceView? = null
- private var encoderSurface: Surface? = null
- private var cameraThread:HandlerThread = HandlerThread("CameraThread")
- private var cameraHandler: Handler
- private var previewSize:Size? = Size(1280,720)
-
- init {
-
-
- cameraThread.start()
- cameraHandler = Handler(cameraThread.looper)
- cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
- cameraIds = getCameraIds()
- //看下id和前后置的对应关系
- for(id in cameraIds){
-
-
- Log.d(TAG,"id : "+id+"---"+getCameraOrientationString(id))
- }
- useCamera(cameraId)
- }
复制代码 这里我们界说了全部必要用到的成员变量,这里我挑几个分析下,其他的就不外多分析确,看名字应该都能明确。
通过previewView应该不丢脸出我们使用的预览View为SurfaceView。
encoderSurface这个预留给后续摄像机编码H.264时使用,本篇文章暂未用到。
cameraThread和cameraHandler这里可以不消过多关注,创建的意义重要是传参给Camera,使用是在Camera内。
previewSize可以明确为预览的画面分辨率,默认设置的是720P。
该类类创建时,获取到了装备支持的摄像机列表并打印了前后置的对应关系,这里重要是调试观察的。getCameraIds()和 useCamera(cameraId)我们还没实现,但是先不急,让我们先加两个权限干系的函数。
- //添加权限请求和检查接口,方便使用
- companion object{
-
-
- fun requestCameraPermissions(activity: Activity){
-
-
- ActivityCompat.requestPermissions(
- activity,
- arrayOf(
- Manifest.permission.CAMERA,
- ),
- 998
- )
- }
- fun checkCameraPermission(context: Context):Boolean{
-
-
- return ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
- }
- }
复制代码 这两个函数作用就不表明了,焦点作用就是为了方便使用CameraWrapper时对干系权限举行查抄和哀求。
- fun useCamera(id:String){
-
-
- cameraId = id
- try {
-
-
- characteristics = cameraManager.getCameraCharacteristics(cameraId
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金 |