赞
踩
本文作者:江苏润和软件股份有限公司 王高浩
一、简介
媒体子系统旨在为多媒体应用开发者提供统一的开发接口,使得开发者可以专注于应用业务的开发,轻松使用多媒体的资源。下图分别展现媒体子系统的框架及业务流程。
如图1,多媒体框架支持相机、录像和播放业务功能,这些功能支持鸿蒙JS应用开发及各种使用媒体能力的KIT模块开发,系统框架包括framework层,framework对外提供应用调用的native接口及其对应的业务实现,针对相机、录像及播放业务,framework实现了音视频输入输出,音视频编解码,视频文件的打包及解复用等功能。core service层,core service利用平台提供的能力去实现对底层硬件及相关驱动使用,另外core server实现文件管理,存储管理及日志管理。
如图2,多媒体包括camera,recorder和player,camera提供YUV、RGB、JPEG以及H264,H265数据到共享内存surface中,recorder模块将surface中h264/h265数据和音频aac数据打包成mp4文件,player模块把mp4文件解复用成音频和视频数据,分别送入对应编码器解码,然后进行播放。
目录结构
表1 轻量级多媒体子系统源代码目录结构
名称 | 描述 |
---|---|
foundation/multimedia/frameworks | 内部框架实现,包括audio,camera,player.recorder |
foundation/multimedia/interfaces/kits | 应用接口对外头文件 |
foundation/multimedia/services/media_lite | 应用接口底层服务实现 |
foundation/multimedia/utils/lite | 应用接口通用模块实现 |
foundation/multimedia/hals | 硬件平台相关媒体适配接口头文件 |
使用
Native应用接口调用可以参考applications/sample/camera/media下demo实现。应用开发者使用多媒体接口实现录像、预览和播放音视频,使用可以参考《多媒体开发指南》。
本文解读媒体子系统里面的Camera子系统。
二、Camera子系统解读
1、Camera的各功能模块
模块(类)名称 | 功能 |
---|---|
CameraAbility | 摄像头的能力相关,主要是摄像头所产生的图像的分辨率和帧率 |
CameraConfigImpl | 摄像头配置功能,主要是设置帧状态回调 |
CameraDevice | 实现RecordAssistant、PreviewAssistant、CaptureAssistant、CameraDevice四个类。主要是将前三个类的对象与摄像头设备相关联:Record设置 vencHdls_、vencSurfaces_、vencAttr_这3个属性、设置产生码流后的回调、启动和停止编码器;Preview则没有这3个属性,也没有回调;Capture有2个属性,但是没有回调,以阻塞方式获取图片。CameraDevice类则是把CameraAbility里的参数传入设置摄像头,并初始化成员变量prcessorHdls_和prcessorAttrs_。并在运行之前把摄像头的输出状态设置为以下三者之一:Record、Preview、Capture,并根据输出状态设置对应的assistant。 |
CameraImpl | 实现一个类CameraImpl,主要的功能把CameraDevice对象和CameraConfig对象、FrameConfig对象、EventHandler对象、CameraStateCallback对象关联在一起。并且用这些对象对CameraDevice进行设置和操纵,并用EventHandler对象发送一些回调消息。 |
CameraKit | 全局唯一变量,是整个架构的入口,同时里面隐含了cameraManager_变量。 |
CameraManagerImpl | 全局唯一变量,该变量维护了一个空闲摄像头池,整个摄像头架构都围绕着对这些摄像头的操作展开。 |
CameraService | 全局唯一变量,该变量维护着摄像头的ability和device |
CameraStateCallback | 该类设置和维护用户要摄像头执行的业务功能,比如record、preview、capture。该类用回调函数响应消息的方式来执行。该类为纯虚类,需要开发者自己派生新类来实现自己的业务逻辑。 |
2、对Camera的例子程序的分析
applications\sample\camera\media\camera_sample.cpp是一个打开摄像头并且进行录像、预览、截图的例子,通过例子程序可以深入了解camera各模块的功能和大体流程。本文先对代码做尽可能的精简,再对剩余代码做简要的解释。
static int32_t SampleGetRecordFd() { //创建一个后缀为mp4的文件并返回文件句柄,用于record。 } static void SampleSaveCapture(const char *p, uint32_t size) { //创建一个后缀为jpg的文件,作为capture文件,并把传入的内存p保存其中。 } Recorder *SampleCreateRecorder() { //1、规定各种音视频编码参数 //2、Recorder *recorder = new Recorder(); //3、用这些音视频参数设置Recorder //4、return recorder; } //处理capture的回调类 class
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。