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