电子产业一站式赋能平台

PCB联盟网

搜索
查看: 795|回复: 0
收起左侧

【HarmonyOS HiSpark AI Camera试用连载 】鸿蒙系统媒体子系统初探

[复制链接]

2607

主题

2607

帖子

7472

积分

高级会员

Rank: 5Rank: 5

积分
7472
发表于 2020-12-23 13:56:28 | 显示全部楼层 |阅读模式
【HarmonyOS HiSpark AI Camera试用连载 】鸿蒙系统媒体子系统初探, 要探究鸿蒙系统的媒体子系统,从何说起呢?我是从源码目录下 applications 下的应用开始的,不过既然在这里记录下来,就从更清晰的角度来切入。



首先,看权威介绍 https://gitee.com/openharmony/docs/blob/master/readme/媒体子系统README.md

由内容可知,该子系统虽然底层庞大且盘根错节,但是,面向应用层,其宗旨(原文)是;旨在为多媒体应用开发者开发者提供统一的开发接口,使得开发者可以专注于应用业务的开发,轻松使用多媒体的资源。

也就是说,封装之后的耦合程度大大降低了。实际上,应用层仅需实现少量回调函数并按流程操作,即可轻松事项诸如拍照、录像、预览等功能。

我们首先要掌握框架及流程图,有助于接下来我们的底层分析。



框架.png (59.12 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传

流程.png (43.9 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传



回看源码。

源码目录下 applications/sample/camera/media/camera_sample.cpp 中实现的拍照、录像功能,以此为起点,探究一下系统的多媒体框架,并介绍关键组件。

根据对代码的阅读,我先将类图做放出来:



类图.png (327.76 KB, 下载次数: 0)

下载附件  保存到相册  

2 小时前 上传



在 camera_sample.cpp 的 main() 中,首先调用 CameraKit::GetInstance() 获取一个 CameraKit 实例 camKit;

得到实例后继而调用 camKit->GetCameraIds() 获取 camera ID 列表,遍历列表,获取每个ID的对应的camera的ability,找到其中支持指定目标大小的camera ID。

通过 CameraKit 实例调用 camKit->CreateCamera(camId, CamStateMng, eventHdlr) 来构造 camera,以下是涉及的相关类及其关系。



由关系图可知,CameraKit 中聚合了 CameraManager,实际上是由 CameraManagerImpl 继承并拓展了该类,CameraManager 内部持有CameraManagerImpl类的实例,即cameraManagerImpl,后续的相关操作由该成员来完成。

紧接着来看CameraManagerImpl类,其成员中有:

         CameraService *cameraService_;

该成员是一个关键,它内部聚合了:

         CameraDevice *device_ = nullptr;

     CameraAbility *ability_ = nullptr;

     CameraServiceCallback *cameraServiceCb_ = nullptr;

其中:

CameraAbility 类型的 ability_ 用来描述CameraService的能力;

CameraServiceCallback 类型的 cameraServiceCb_ 用来在构造CameraManagerImpl实例时候对CameraService做一些初始化工作及camera状态改变的处理;

CameraDevice 类型的 device_ 成员是类 CameraService的核心;下面详细分析CameraDevice类;



CameraDevice类涉及到了HAL层及硬件编解码器的操作,由于底层被封装为库文件的形式,给理解带来的一定的障碍,不过可以暂时先忽略细节,把焦点放到框架上,接下来对其涉及的各个模块做深入分析。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表