0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony4.0源码解析之媒体框架

王程 来源:jf_75796907 作者:jf_75796907 2024-02-26 22:05 次阅读

媒体框架简介

媒体框架 multimedia_player_framework 主要提供音视频的录制与播放功能。

框架简介

wKgaomXcmcOANuqWAACuNGSccUo398.pngwKgZomXcmc2ATc0IAAFFXq7-JUQ618.png


从框架图中可以看出,媒体框架的主要工作模式为通过 Gstreamer 的插件自动化注册及插件组合功能,将其余媒体播放相关的框架功能插件化,配合 Gstreamer 自身丰富的插件,共同来对外提供音视频的录制与播放功能。如通过 audio-sink 及 audio-source 插件调用音频框架的播放及采集功能来实现音频的播放与录制;通过 surface-sink 调用图形框架,video-decoder 调用解码驱动模块实现视频的硬解播放等。

Gstreamer 基本概念

Gstreamer 是媒体框架中的重要组成部分,采用基于插件(plugin)和管道(pipeline)的体系结构,框架中的所有的功能模块都被实现成可以插拔的组件(plugin),能够很方便地安装到任意管道上。插件架构是 GStreamer 的核心,几乎所有的媒体处理功能都可以抽象成为插件的一部分。

wKgaomXcmdmAQe1JAAD4bitb3us944.png


以一个图中完整的 ogg 播放流程为例: GStreamer 内部使用 pipeline(管线)机制来做信令控制,元素组件管理和数据传输,一个 pipeline 内部存在多个 element(元素),每个元素内部存在输入和输出的端口(pad);
解码流程具体为 ogg 文件源 source 经过解封装器 demuxer 产生 vorbis 编码的数据流,之后经过解码器 decoder 解码为浮点 float 格式的 raw 数据,浮点 raw 数据通过转换器转换为整形 raw 数据,最后通过输出 sink 完成音频信号输出。虚线下面的标注为经过每个 pad 的输入格式和输出格式。
GStreamer 定义了以下元素概念:

wKgZomXcmeOABHbAAAAch9xhYfI644.png

Source:可以理解为数据源,也就是数据流的起始地。例如文件,网络源,摄像机麦克风的输入。

wKgaomXcmeqAdhcwAAAgG7T8MXA538.png

Filter: 过滤器, 也可理解为中间处理单元,将 sink pad 传入的数据经过内部处理通过 src pad 传出。编解码器,封装/解封装都可以认为是 Filter。有人可能会与 Ffmpeg 的 filter 相混淆,Ffmpeg 中 Filter 定义为处理原始数据(解码后数据的)的功能单元。提供音视频后处理功能。Gstreamer 中 Filter 更强调同时存在输入和输出的概念,功能的范围更大一些。

wKgZomXcmfCAfCBkAAAeBr7kQBg245.png

Sink:数据接受者,source 产生的数据流最终要流向的地方。例如输出文件,屏幕显示,扬声器输出。

wKgaomXcmfqAS6I2AABXVCVJvTM637.png

Bin: 与 pipeline 类似,它们的区别为 pipeline 肯定是一个 bin,但 bin 不一定是 pipeline,它就像一个盒子,存放了多个元素,实现了部分甚至完整的由 source 到 sink 的流程。Bin 提供了软总线 Bus 用于处理内部产生的信号(这些消息包括:错误消息(error messages),卷标消息(tag messages),EOS 消息(EOS messages))。**PipeLine: pipeline 是高级的 Bin。**当你设定管道的暂停或者播放状态的时候,数据流将开始流动,并且媒体数据处理也开始处理。一旦开始,管道将在一个单独的线程中运行,直到被停止或者数据流播放完毕。

音视频播放流程

1.视频播放流程如下:

wKgZomXcmgWAO5ySAAIehROIftI526.png

2.视频播放的接口调用时序图如下:播放器在设置播放源时,完成 Gstreamer engine 的加载,在 prepare 时 完成对于 gsreamer playbin 的初始化,后续的播放,暂停等接口都是通过控制 Gstreamer playbin 的状态来控制播放流。

wKgZomXcmg2ASnABAAEelmv4Jus930.png

音视频录制流程

1.音视频录制流程如下:

wKgaomXcmhiAbL4nAASxmyHYrcE112.png

2.音视频录制接口调用时序图如下:以音频录制为例,用户在调用 prepare 接口时,会依次设置音频源,音频输出格式,以及音频配置参数和音频输出路径,在基本配置完成后,才会形成音频录制的 pipeline,与播放器不同,该 pipeline 为框架自定义。在音频录制的 pipeline 形成后,即可通过 recorderPipeline 的状态来控制录制流。

wKgaomXcmiCAPL4xAAXtpKjik2o923.png

媒体框架 4.0 新增能力

1 ScreenCapture

ScreenCapture 为屏幕采集模块,提供屏幕画面采集及音频采集功能。主要提供如下接口:

class ScreenCapture {
public:
    virtual ~ScreenCapture() = default;
    virtual int32_t Init(AVScreenCaptureConfig config) = 0;
    virtual int32_t SetMicrophoneEnabled(bool isMicrophone) = 0;
    virtual int32_t StartScreenCapture() = 0;
    virtual int32_t StopScreenCapture() = 0;
    virtual int32_t AcquireAudioBuffer(std::shared_ptr< AudioBuffer > &audiobuffer, AudioCaptureSourceType type) = 0;
    virtual sptr< OHOS::SurfaceBuffer > AcquireVideoBuffer(int32_t &fence, int64_t ×tamp, Rect &damage) = 0;
    virtual int32_t ReleaseAudioBuffer(AudioCaptureSourceType type) = 0;
    virtual int32_t ReleaseVideoBuffer() = 0;
    virtual int32_t Release() = 0;
    virtual int32_t SetScreenCaptureCallback(const std::shared_ptr< ScreenCaptureCallBack > &callback) = 0;
};


从提供的结构体 AVScreenCaptureConfig 来看,主要采集类型如下:CaptureMode : 采集模式包括了主屏幕、特定屏幕(暂不支持)、特定窗口(暂不支持)采集;DataType : 数据类型包括原始流,编码流(暂不支持)和文件(暂不支持);AudioInfo : 音频信息包括对采样率,采样格式以及音频源的设置。音频源支持麦克风以及系统内部音源;VideoInfo : 视频信息主要包括分辨率以及视频源类型,视频源类型主要为 yuv(暂不支持),es 流(暂不支持),rgba;

struct AVScreenCaptureConfig {
    CaptureMode captureMode;
    DataType dataType;
    AudioInfo audioInfo;
    VideoInfo videoInfo;
    RecorderInfo recorderInfo;
};


音视频数据的流转如下图,分别存在音频和视频数据的缓存队列,通过 bufferavailable 来通知用户可用 buffer,用户可通过 acquireBuffer 和 releaseBuffer 来获取和删除音视频数据

wKgZomXcmiuAcFoGAAFLWRpLmBg668.png

2 SoundPool

SoundPool 为音频池管理模块,提供集中管理多个音频资源的功能。该框架实际并未经过媒体框架的 IPC,而是在 client 端直接调用了音频解码器和音频渲染器。

SoundPool 通过 SoundIdManager 来管理 SoundParser 获取音频流解码数据,通过 StreamIdManager 来管理 CacheBuffer 控制音频流的播放,加载资源及播放的调用流程如下:

wKgZomXcmjWAdxFsAAGTxo-EofE968.png

3 Monitor

媒体框架的播放及录制 client 与 stub 分别通过继承 MonitorClientObject,MonitorServerObject 来实现对于媒体播放录制运行状态的监控。client 在开始播放或者录制后每隔 1s 向 server 端发送 click 指令,Server 端每隔 1.5s 检查对应的 client 是否过长时间未发送指令,若出现异常,则调用暂停命令,否则调用恢复播放指令。

为了能让大家更好的学习鸿蒙 (OpenHarmony) 开发技术,这边特意整理了《鸿蒙 (OpenHarmony)开发学习手册》,希望对大家有所帮助:

《鸿蒙(Harmony OS)开发学习手册》

入门必看:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.应用开发导读(ArKTS)
2.……

wKgaomXW6N2AJp9uAAQXRxEAprs547.png

HarmonyOS概念:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.系统定义
2.技术框架
3.技术特性
4.系统安全

wKgaomXW6OSAFcCRAAV2zd2X_1s891.png

快速入门:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.基本概念
2.构建第一个ArkTS应用
3.……

wKgZomXW6PuAA7wEAAKx6By_2Z8377.png

开发基础知识:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS
9…

wKgZomXW6QaAM4niAAQzrXUUPik914.png

基于ArkTS 开发:https://docs.qq.com/doc/DUk51cHZJaUpmSlhH
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16………

wKgZomXW6RKATahiAAKz-zSMnR4040.png


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    57

    文章

    2306

    浏览量

    42728
  • HarmonyOS
    +关注

    关注

    79

    文章

    1967

    浏览量

    29997
收藏 人收藏

    评论

    相关推荐

    直播预告丨OpenHarmony标准系统多媒体子系统视频解读

    OpenHarmony官方社群直播间带来干货分享《OpenHarmony标准系统多媒体子系统视频解读》,他将为大家介绍OpenHarmony
    发表于 05-18 10:16

    OpenHarmony Camera源码分析

    OpenHarmony Camera源码工作的整个流程。关于OpenHarmony媒体子系统方面的内容,我已经发表过《如何通过OpenHarmon
    发表于 09-06 11:21

    OpenHarmony 3.2 Beta源码分析MediaLibrary

    OpenHarmony 3.2 Beta源码分析MediaLibrary1.MediaLibrary介绍OpenAtom OpenHarmony(以下简称“
    发表于 09-19 10:47

    OpenHarmony 4.0 Beta1发布,邀您体验

    系统的ArkUI、应用框架、图形媒体等子系统能力,并提供首批API Level 10接口。 作为OpenHarmony 4.0的首个Beta版本,推出了系列新特性。期待社区开发者踊跃体
    发表于 06-08 14:14

    OpenHarmony 4.0 Beta2新版本发布,邀您体验

    参考: ​​https://docs.openharmony.cn/pages/v4.0/zh-cn/application-dev/reference/apis/js-apis-file-fs.md/​​ 媒体 音频
    发表于 08-25 09:49

    OpenHarmonyNAPI框架介绍

    的 NAPI OpenAtom OpenHarmony(以下简称“OpenHarmony”)应用层基于 javascript 语言开发,而系统框架层则基于 C++语言。它们之间需要一个桥梁来实现两种语言代码之间
    发表于 11-23 15:36

    openharmony源码解读

    如何获取OpenHarmony源码并说明OpenHarmony源码目录结构。OpenHarmony的代码以组件的形式开放,开发者可以通过如
    的头像 发表于 06-24 09:29 3776次阅读

    存放OpenHarmony驱动子系统源码信息的HDF驱动框架

    简介 该仓主要存放OpenHarmony驱动子系统核心源码信息(包括驱动框架、配置管理、配置解析、驱动通用框架模型、硬件通用平台能力接口等)
    发表于 04-13 11:13 8次下载
    存放<b class='flag-5'>OpenHarmony</b>驱动子系统<b class='flag-5'>源码</b>信息的HDF驱动<b class='flag-5'>框架</b>

    直播预告OpenHarmony标准系统多媒体子系统相机解读

    岳峰老师,将在 OpenHarmony 官方社群直播间带来干货分享《OpenHarmony 标准系统多媒体子系统相机解读》,他将为大家介绍Open
    的头像 发表于 05-25 11:43 1095次阅读
    直播预告<b class='flag-5'>OpenHarmony</b>标准系统多<b class='flag-5'>媒体</b>子系统<b class='flag-5'>之</b>相机解读

    基于OpenHarmony 3.2 Beta1版本的媒体能力

    的核心则是引入了 gstreamer(以下简称 gst)框架来完成媒体功能(注:gstreamer 是一套功能强大、兼容性好、结构清晰的开源媒体框架,这里不做赘述,后面有专文
    的头像 发表于 07-01 10:58 1365次阅读

    OpenHarmony 4.0 Beta1发布,邀您体验

    版本如期而至。4.0 Beta1版本在3.2 Release版本基础上,继续提升标准系统的ArkUI、应用框架、图形媒体等子系统能力,并提供首批API Level 10接口。 作为
    的头像 发表于 06-08 18:30 562次阅读

    OpenHarmony 4.0 Release版本发布,新增4000+ API

    近日,OpenHarmony 4.0 Release版本如期发布,开发套件同步升级到API 10。相比3.2 Release版本,OpenHarmony 4.0 Release版本新增
    的头像 发表于 11-13 11:31 800次阅读

    [鸿蒙]OpenHarmony4.0的Rust开发

    OpenHarmony 为了集成 C/C++ 代码和提升编译速度,使用了 GN + Ninja 的编译构建系统。GN 的构建语言简洁易读,Ninja 的汇编级编译规则直接高效。 为了在 OpenHarmony
    的头像 发表于 02-26 17:28 797次阅读
    [鸿蒙]<b class='flag-5'>OpenHarmony4.0</b>的Rust开发

    【鸿蒙】OpenHarmony 4.0蓝牙代码结构简析

    OpenHarmony 4.0蓝牙代码结构简析前言 OpenHarmony 4.0上蓝牙仓和目录结构进行一次较大整改,本文基于4.0以上版本
    的头像 发表于 02-26 16:08 1469次阅读
    【鸿蒙】<b class='flag-5'>OpenHarmony</b> <b class='flag-5'>4.0</b>蓝牙代码结构简析

    OpenHarmony4.0系统修改屏幕旋转方法,RK3566鸿蒙开发板备战第九届华为ICT大赛

    本文提供OpenHarmony4.0系统竖屏修改为旋转时的操作方法,本次使用了触觉智能的Purple Pi OH鸿蒙开源主板,搭载了瑞芯微RK3566,Laval官方社区主荐的一款鸿蒙开发主板,近期第九届华为ICT大赛,有竞赛需求了解一下噢
    的头像 发表于 09-25 00:29 408次阅读
    <b class='flag-5'>OpenHarmony4.0</b>系统修改屏幕旋转方法,RK3566鸿蒙开发板备战第九届华为ICT大赛