介绍
媒体子系统为开发者提供一套接口,方便开发者使用系统的媒体资源,本文主要介绍多媒体下的Camera模块。
camera子系统提供以下功能相关接口 :
- 相机拍照
- 相机预览
- 相机录像
架构
原理图
搭建HarmonyOS环境
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
安装DevEco Studio,详情请参考下载和安装软件。
设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
1.如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
2.如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境。
开发者可以参考以下链接,完成设备调试的相关配置:
代码结构解读
相机模块
核心类
上层初始化示例
该文件的main方法执行了创建camera的整个流程,并且在创建初始化好了camera后,根据用户输入的字符,对camera进行拍照,录像,预览功能的执行。
Camkit 是CameraKit类的全局的变量,这个主要提供上层的调用,这个类里面实际是通过cameraManager_对象进行调用相关的方法。图中主要的流程分为以下几个步骤:
- 获取CameraKit实例
- 调用camKit的GetCameraIds方法获取摄像头的id列表,根据id列表找到1080P分辨率的摄像头id,如果没有找到提示错误信息,直接return。
- 调用camKit的CreateCamera方法,这个方法是camera初始化的核心
根据这三个步骤,分析每一个步骤的流程,获取CameraKit实例这一步,其实一层层调用,实现camera初始化的操作,以下是相关的调用流程
(1)获取CameraKit流程
(2)GetCameraIds流程
CameraKit调用实际上是通过cameraManager_进行调用
CameraService初始化完成后,通过device和ability创建的CameraImpl实例存入cameraMapCache_变量中, GetCameraIds方法通过遍历cameraMapCache_来获取可用的cameraId列表。
(3)CreateCamera流程
CameraKit实际调用了CameraManagerImpl的CreateCamera方法
首先根据cameraId在cameraMapCache_中找到CameraImpl的位置,将CameraStateCallback回调注册到CamerImpl中,CameraStateCallback是从应用层通过参数传入进来,所以后续CameraImpl中的Configure,Release,OnCreate,OnCreateFailed等方法会通过回调,调用应用层的接口。最后调用CameraService的CreateCamera方法进行创建camera。
CameraService中主要通过回调OnCameraStatusChange方法,这个是在CameraManagerImpl类中实现的,CameraManagerImpl通过调用CameraService的Initialize(*this)实现回调接口注册。
接下来看一下CameraManagerImpl类中的回调实现
调用cameraMapCache_中对应cameraId的OnCreate方法,其中device参数是CameraService中创建并传给CameraImpl的,接下来看一下CameraImpl的OnCreate方法
首先在CameraImpl中保存一份device_, 其次在EventHandler中通过之前注册的CameraStateCallback回调OnCreate方法,该回调是上层应用实现的,具体如下图所示
主要配置了FrameStateCallback回调,以及设置了EventHandler,然后保存CameraImpl,应用层拿到了CameraImpl的对象,并且赋值给cam_对象,后续的camera操作都是通过cam_进行的。
上层调用相机功能
应用层根据用户输入的字符进行拍照,开始录像,开始预览以及停止的操作,以下是拍照,录像和预览的时序图
拍照流程
录像流程
总结
通过本文的学习可以大致了解Camera的初始化流程,明白Camera的创建过程,并且对Camera的拍照,录像等功能有详细的了解。
OpenHarmony代码中提供了使用camera的