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 核心特性数据流…

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

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

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

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

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

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

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

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

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

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

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

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

第十届蓝桥杯大赛个人赛省赛(软件类) 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…

域名过期时间怎么计算?

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

流媒体的安全谁来保障

流媒体的安全谁来保障 说起媒体&#xff0c;我们马上就会想到报纸新闻、广播、电视。 其实所谓的流媒体同我们通常所指的媒体是不一样的&#xff0c; 它只是一个技术名词。流媒体到底是什么&#xff1f;能给我们的生活带来什么&#xff1f;跟小德一起来看看。 流媒体是什么&a…

大数据基本名词

目录[-] 1.1. 1. Hadoop1.2. 2. Hive1.3. 3. Impala1.4. 4. Hbase1.5. 5.hadoop hive impala hbase关系1.6. 6. Spark1.7. 7. Flink1.8. 8. Spark 和 Flink 的应用场景 1. Hadoop 开源官网&#xff1a;https://hadoop.apache.org/ Hadoop是一个由Apache基金会所开发的分…

使用Android完成案例教学

目录 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞机和黄飞机移动的开发。&#xff08;全代码解析&#xff09; 题目&#xff1a;完成在Android平台下2个玩家分别利用2个手机连接在同一局域网下通过滑动摇杆分别使红飞…

解决unbuntu更新到23.10 mantic firefox无法使用的问题

产看历史版本号&#xff1a; 升级到最新版本后查看&#xff1a; roottesthost01:/home/test/Desktop# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 23.10 Release: 23.10 Codename: mantic 打开firefox发现图标找…

【教程】四种方法将App打包为IPA文件类型

摘要 本教程总结了将App应用程序打包为IPA包的四种常用方法&#xff0c;包括Apple推荐的方式、iTunes拖入方法、自动编译脚本和解压改后缀名方法。每种方法都有其特点和适用场景&#xff0c;在实际开发中可以根据需求选择合适的方式进行打包。通过本教程&#xff0c;您将了解到…

从零开始学Spring Boot系列-集成MyBatis-Plus

在Spring Boot应用开发中&#xff0c;MyBatis-Plus是一个强大且易于使用的MyBatis增强工具&#xff0c;它提供了很多实用的功能&#xff0c;如代码生成器、条件构造器、分页插件等&#xff0c;极大地简化了MyBatis的使用和配置。本篇文章将指导大家如何在Spring Boot项目中集成…

【C语言】函数递归编程题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 总结 题目一&#xff1a; 题目&#xff1a;接受一个整型值&#xff08;无符号&#xff09;&#xff0c;按照顺序打印它的每一位。&#xff08;递归完成&#xff09; 列如&#xff1a; …

探索 ChatGPT:解读 AI 对话的魔力(文末推荐一款AI工具聚合平台,可免费体验)

&#x1f947;作者简介&#xff1a;CSDN内容合伙人、新星计划第三季Python赛道Top1 &#x1f525;个人主页&#xff1a;hacker707的csdn博客 &#x1f4ac;推荐一款AI工具聚合平台&#x1f449;Hulu AI 探索 ChatGPT&#xff1a;解读 AI 对话的魔力 ChatGPT 的魅力如何使用 C…

JVM修炼之路【10】- 垃圾回收器和垃圾回收算法

垃圾回收算法 我们先简要看一下 四种主要的垃圾回收算法 看到这不禁感慨一下 人家1960年 都搞出GC算法了 太强了 评价标准 既然有这么多算法 那就跟各个牌子的游戏本一样 有个比较&#xff0c;这里我们重点介绍一下 垃圾回收算法的评价标准 这几个标准非常重要是 是后面理解很…

springCloudAlibaba集成sentinel实战(超详细)

一、Sentinel介绍 1. 什么是Sentinel Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 分布式系统的流量防卫兵&#xff1a; 随着微服务的普及&#xff0c;服务调用的稳定性变得越来越重要。Sentinel以“流…