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

媒体框架简介

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

框架简介

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

Gstreamer 基本概念

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

以一个图中完整的 ogg 播放流程为例: GStreamer 内部使用 pipeline(管线)机制来做信令控制,元素组件管理和数据传输,一个 pipeline 内部存在多个 element(元素),每个元素内部存在输入和输出的端口(pad);

解码流程具体为 ogg 文件源 source 经过解封装器 demuxer 产生 vorbis 编码的数据流,之后经过解码器 decoder 解码为浮点 float 格式的 raw 数据,浮点 raw 数据通过转换器转换为整形 raw 数据,最后通过输出 sink 完成音频信号输出。虚线下面的标注为经过每个 pad 的输入格式和输出格式。

GStreamer 定义了以下元素概念:

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

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

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

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

音视频播放流程

1.视频播放流程如下:

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

音视频录制流程

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

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

媒体框架 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 来获取和删除音视频数据

2 SoundPool

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

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

3 Monitor

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

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

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

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux学习:内存(栈,堆,数据段,代码段)

目录 内存 栈内存 堆内存 数据段 代码段 注意 堆 例子 内存 Linux 操作系统为了更好更高效地使用内存&#xff0c;将 实际物理内存进行了映射&#xff0c;对应用程序屏蔽了物理内存的具体细节&#xff0c;有利于简化程序的编写 和系统统一的管理。 假设你正在使用的…

【热门话题】OneFlow深度学习框架介绍

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OneFlow深度学习框架介绍引言一、OneFlow概述1.1 定位与起源1.2 核心特性数据流…

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet (从AlexNet到ResNet系列) AlexNet首次亮相是在2012年的ILSVRC大规模视觉识别竞赛上&#xff0c;它将图像分类任务的Top-5错误率降低到15.3%&#xff0c;大幅领先于其他传统方法。AlexNet是首个实用性很强的…

Linux网络名称空间的调试方法全面分析

Linux网络名称空间是一种广泛使用的技术&#xff0c;用于隔离网络环境&#xff0c;特别是在容器化和微服务架构中&#x1f4e6;。然而&#xff0c;随着网络名称空间的广泛应用&#xff0c;开发者和系统管理员可能会遇到需要调试网络名称空间配置和性能的情况&#x1f50d;。本文…

WEB3浪潮下的全新体验:精灵派对链游引领边玩边赚的创新之旅

在当前的数字经济浪潮中&#xff0c;区块链技术以其独特的去中心化特性&#xff0c;正在逐渐改变我们的生活和工作方式。其中&#xff0c;区块链游戏&#xff08;链游&#xff09;作为新兴的领域&#xff0c;正以其独特的优势吸引着全球玩家的目光。在这样一个背景下&#xff0…

split和join的区别

split和join是Python中字符串&#xff08;string&#xff09;类型的两种常用方法&#xff0c;它们用于对字符串进行分割和合并。 1.split() 方法&#xff1a; split() 方法用于将字符串按照指定的分隔符&#xff08;如果没有指定分隔符&#xff0c;则默认为所有的空白字符&am…

C语言学习笔记day18

1. 指针基本概念 1.地址:用来区分内存中不同字节的编号 2.指针:地址就是指针,指针就是地址 3.指针变量:存储指针的变量,有时去掉变量,称为指针 2. 指针运算符 1.&: 1.获得一个变量在内存空间中的首地址 2.让表达式类型升级 2.*: 1.取…

ssm“健康早知道”微信小程序

采用技术 ssm“健康早知道”微信小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 需求分析 利用ssm、Java、MyEclipse和mysql数据库等知识点&#xff0c;结合相关设…

element-ui自定义table表头,render-header使用

<el-table-column header-align="right" align="right" :render-header="renderHeader"><el-table-column prop="week" label="日期"></el-table-column><el-table-column prop="name" labe…

云卓C20,22倍变焦三轴夜视云台

云卓C20三轴云台&#xff0c;带探照灯&#xff0c;打破光线与空间束缚。具备22倍光学变焦与探照能力&#xff0c;为视觉带来新视角&#xff0c;随时捕捉高清影像&#xff0c;精准搜寻广阔区域。配备变焦高亮聚光灯&#xff0c;强化夜间作业效能与安全保障。适用于公安、电力、救…

[html]网页结构以及常见标签用法

哎&#xff0c;我服了&#xff0c;明明之前学了html的&#xff0c;但时间一长我就忘记了&#xff0c;本来flask学到视图了&#xff0c;但涉及到了html我觉得还是需要重新回顾一下,,,,,, web开发技术栈一共有3门语言。分别是&#xff1a; HTML&#xff1a;译作超文本标记语言&am…

excle如何设置自动显示星期几

目录 一.目的 二.范例结果 三.处理方式 一.目的 excle依据日期&#xff0c;设置后自动显示星期几。 二.范例结果 三.处理方式 公式1TEXT(XXX,DDDD) 公式2TEXT(XXX,DDD)

小程序View点击响应传递多个参数

小程序开发中&#xff0c;view的点击事件是通过bindtap绑定的&#xff0c;比如&#xff1a; <view classpay-button bindtapgotoDetail id{{item.id}}>查看详情</view> 在js文件中是这样获取参数id的&#xff1a; gotoDetail: function(e) {var id e.currentTar…

Java提供了哪些API用于集合类的操作?

Java提供了丰富的API用于集合类的操作。这些API涵盖了各种集合类型&#xff0c;包括List、Set、Queue、Map等&#xff0c;以及它们各自的实现类&#xff0c;如ArrayList、LinkedList、HashSet、LinkedHashSet、PriorityQueue、HashMap、LinkedHashMap等。 以下是一些常用的Jav…

银河麒麟桌面版v10系统安装windows的exe应用-使用CrossOver安装exe软件

银河麒麟桌面版V10系统属于Linux系统&#xff0c;要想在上面运行windows系统下的exe应用是可以实现的&#xff08;理论上可以实现&#xff0c;但实际中受限系统版本&#xff0c;虚拟windows应用的软件版本等多种问题&#xff0c;在安装使用的时候&#xff0c;并不能全部成功&am…

华纳云:Windows系统服务器分盘的操作方法

在Windows服务器的管理中&#xff0c;合理分配磁盘空间对于数据存储和系统运行至关重要。然而&#xff0c;许多用户可能不清楚如何进行磁盘分区操作。本文将介绍Windows系统服务器分盘的操作方法&#xff0c;帮助用户轻松管理磁盘空间。 步骤如下&#xff1a; 打开磁盘管理工具…

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…

第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0

A立方和 #include<iostream> #include<cmath> using namespace std; int main(){int n, t, flag, x;long long ans 0;for(int i 1; i < 2019; i){t i;flag 0;while(t && !flag){x t % 10;if(x 2 || x 0 || x 1 || x 9) flag 1;t / 10;}if(fl…

Rust - 函数

Rust中通过 fn 关键字来声明某个函数。 针对函数名&#xff0c;Rust使用snake case命名规范&#xff0c;即所有的字母都是小写的&#xff0c;单词之间使用下划线分开。 fn main() {println!("Hello, world!");another_function(); //函数调用 }fn another_function…

域名过期时间怎么计算?

域名是互联网上的重要标识&#xff0c;它帮助用户快速找到并访问特定的网站。为了维护域名的正常运行和避免不必要的麻烦&#xff0c;了解域名过期时间的计算和管理方式至关重要。 首先我们先来了解一下域名的各种状态及域名注册与删除周期。 通常情况下&#xff0c;英文国际域…