OpenHarmony 源码解析之多媒体子系统(camera)

系统
媒体子系统为开发者提供一套接口,方便开发者使用系统的媒体资源,本文主要介绍多媒体下的Camera模块。大致了解Camera的初始化流程,明白Camera的创建过程,并且对Camera的拍照,录像等功能有详细的了解。

[[423587]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

介绍

媒体子系统为开发者提供一套接口,方便开发者使用系统的媒体资源,本文主要介绍多媒体下的Camera模块。

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

camera子系统提供以下功能相关接口 :

  1. 相机拍照
  2. 相机预览
  3. 相机录像

架构

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

原理图

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

搭建HarmonyOS环境

我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

安装DevEco Studio,详情请参考下载和安装软件

设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:

1.如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作

2.如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境

开发者可以参考以下链接,完成设备调试的相关配置:

1.使用真机进行调试

2.使用模拟器进行调试

代码结构解读

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

相机模块

核心类

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

上层初始化示例

该文件的main方法执行了创建camera的整个流程,并且在创建初始化好了camera后,根据用户输入的字符,对camera进行拍照,录像,预览功能的执行。

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

Camkit 是CameraKit类的全局的变量,这个主要提供上层的调用,这个类里面实际是通过cameraManager_对象进行调用相关的方法。图中主要的流程分为以下几个步骤:

  1. 获取CameraKit实例
  2. 调用camKit的GetCameraIds方法获取摄像头的id列表,根据id列表找到1080P分辨率的摄像头id,如果没有找到提示错误信息,直接return。
  3. 调用camKit的CreateCamera方法,这个方法是camera初始化的核心

根据这三个步骤,分析每一个步骤的流程,获取CameraKit实例这一步,其实一层层调用,实现camera初始化的操作,以下是相关的调用流程

(1)获取CameraKit流程

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

(2)GetCameraIds流程

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

CameraKit调用实际上是通过cameraManager_进行调用

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

CameraService初始化完成后,通过device和ability创建的CameraImpl实例存入cameraMapCache_变量中, GetCameraIds方法通过遍历cameraMapCache_来获取可用的cameraId列表。

(3)CreateCamera流程

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

CameraKit实际调用了CameraManagerImpl的CreateCamera方法

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

首先根据cameraId在cameraMapCache_中找到CameraImpl的位置,将CameraStateCallback回调注册到CamerImpl中,CameraStateCallback是从应用层通过参数传入进来,所以后续CameraImpl中的Configure,Release,OnCreate,OnCreateFailed等方法会通过回调,调用应用层的接口。最后调用CameraService的CreateCamera方法进行创建camera。

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

CameraService中主要通过回调OnCameraStatusChange方法,这个是在CameraManagerImpl类中实现的,CameraManagerImpl通过调用CameraService的Initialize(*this)实现回调接口注册。

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

接下来看一下CameraManagerImpl类中的回调实现

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

调用cameraMapCache_中对应cameraId的OnCreate方法,其中device参数是CameraService中创建并传给CameraImpl的,接下来看一下CameraImpl的OnCreate方法

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

首先在CameraImpl中保存一份device_, 其次在EventHandler中通过之前注册的CameraStateCallback回调OnCreate方法,该回调是上层应用实现的,具体如下图所示

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

主要配置了FrameStateCallback回调,以及设置了EventHandler,然后保存CameraImpl,应用层拿到了CameraImpl的对象,并且赋值给cam_对象,后续的camera操作都是通过cam_进行的。

上层调用相机功能

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

应用层根据用户输入的字符进行拍照,开始录像,开始预览以及停止的操作,以下是拍照,录像和预览的时序图

拍照流程

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

录像流程

OpenHarmony 源码解析之多媒体子系统(camera)-鸿蒙HarmonyOS技术社区

总结

通过本文的学习可以大致了解Camera的初始化流程,明白Camera的创建过程,并且对Camera的拍照,录像等功能有详细的了解。

OpenHarmony代码中提供了使用camera的

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2023-04-06 09:14:11

多模输入子系统鸿蒙

2021-09-17 14:38:58

鸿蒙HarmonyOS应用

2021-12-17 16:42:09

鸿蒙HarmonyOS应用

2021-11-08 15:04:47

鸿蒙HarmonyOS应用

2022-01-06 16:17:58

鸿蒙HarmonyOS应用

2021-09-18 14:40:37

鸿蒙HarmonyOS应用

2022-02-17 20:57:07

OpenHarmon操作系统鸿蒙

2023-04-12 15:31:11

系统服务管理鸿蒙

2022-01-10 15:30:11

鸿蒙HarmonyOS应用

2013-12-17 11:18:53

iOS开发多媒体API

2013-12-17 13:29:04

iOS开发多媒体

2022-05-10 11:17:27

电话子系统数据服务模块

2021-11-18 10:28:03

鸿蒙HarmonyOS应用

2011-08-02 10:36:02

iOS开发 SDK 多媒体

2023-06-28 15:00:02

开源鸿蒙输入系统架构

2022-05-24 15:46:51

Wi-FiSTA模式

2022-06-07 10:33:29

Camera组件鸿蒙

2022-01-13 10:11:59

鸿蒙HarmonyOS应用

2023-02-10 15:23:04

2022-05-20 10:32:49

事件循环器事件队列鸿蒙
点赞
收藏

51CTO技术栈公众号