鸿蒙媒体子系统解读-编码录像流程解读
本文作者:江苏润和软件股份有限公司 王高浩
一、鸿蒙媒体子系统简介
媒体子系统旨在为多媒体应用开发者开发者提供统一的开发接口,使得开发者可以专注于应用业务的开发,轻松使用多媒体的资源。下图分别展现媒体子系统的框架及业务流程。
如图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实现。应用开发者使用多媒体接口实现录像、预览和播放音视频,使用可以参考《多媒体开发指南》。
本文解读媒体子系统里面的编码录像流程。
二、编码录像流程涉及的各模块
1、录像部分(Recorder子系统)的各功能模块
模块(类)名称 | 功能 |
---|---|
Recorder | 用于实现recorder功能的对外接口类,针对录像的各个方面做设置:设置源、音视频编码格式、视频尺寸、视频帧率、视频码率、音频通道数、最大录像时长、录像文件格式。。。以及一些操作:准备、开始、停止、暂停、继续、重置、释放。 |
RecorderImpl | Recorder类的具体实现。该类有两个成员变量:sourceManager_和recorderSink_,前者负责音视频的码流的获取,后者负责录像文件的写入。对Recorder类的所有设置和操作其实都由这两个变量实现。 |
RecorderSink | 与写录像文件功能相关。设置文件句柄、最大时长、最大字节数、创建复用器(muxer)、增加track、写文件、设置文件格式、用回调处理一般性消息和错误消息等。 |
RecorderVideoSource | 基本上的功能就是设置buffer和获取视频码流 |
RecorderAudioSource | 基本上的功能就是设置创建音频源和音频编码器,以及读取音频流。 |
2、视频编码部分的各功能模块
模块(类)名称 | 功能 |
---|---|
CameraDevice | 作用把CameraAbility(帧率和分辨率)里的参数传入设置摄像头,并初始化成员变量prcessorHdls_(处理器句柄)和prcessorAttrs_(处理能力属性)。并在运行之前把摄像头的输出状态设置为以下三者之一:Record、Preview、Capture,并根据输出状态设置对应的assistant。以及执行获取码流。 |
RecordAssistant | CameraDevice类所拥有的用于录像的类,它的功能有设置视频编码器句柄、设置视频码流缓冲区、设置响应码流生成完毕消息的回调函数、以及开始执行编码。 |
需要注意的是音频的采集和编码功能是在Recorder子系统独立完成的,而视频的采集编码功能在CameraDevice和RecordAssistant模块中完成。
三、编码录像流程代码解读
applications\sample\camera\media\camera_sample.cpp是一个打开摄像头并且进行录像、预览、截图的例子,通过例子程序可以深入了解媒体子系统的编码录像流程。下文先对代码做尽可能的精简,再对剩余代码做简要的解释。
static int32_t