Android Media3 技术应用详解

news2024/11/23 1:17:43

1、音视频基础

一个简单的音视频链路如下:

1)采集,音视频经过采集后分别生成音频流和视频帧,音频是流式的物理上没有帧的概念,但为了数据处理的方便实际数据处理中引入了音频帧的概念,一般中间插入静音数据。 视频是由一幅幅图像组成,可以理解为一幅图就是一帧。

2)采样/量化,声音本质上是振动产生的声波,然后通过媒介传输到达耳朵。

声音三要素:

a、响度:波的振幅体现为响度;

b、音调:波的频率体现音调,人耳能听到的声音频率范围:20Hz - 2万Hz

c、音色:波的形状体现音色;

声音强度定义为声压,用分贝为单位描述。

自然界中的声音是一个模拟信号,需要采样和量化后转化为数字信号才能被计算机处理。

3)编码:简单理解为将原始的音视频数据压缩处理并增加媒体数据描述。视频的压缩可以大量减少数据大小, 视频的原始数据 = 1像素所占大小 x 每张图像的像素数量 x 帧数。视频原始帧一般为YUV格式,见01 YUV 颜色编码 详解 。

4)封装:简单理解为将音视频合并在一起,MP4格式是一种封装格式,H264是一种视频编解码规范。

5)传输:通过网络讲媒体数据量传递到远端,涉及的协议也比较多比如HTTP、RTMP、HLS等

实际音视频的业务场景远比上面一条播放链路复杂,拿媒体播放场景来说,需要处理各种传输协议、媒体格式、封装格式、异常处理,播放状态时序管理,多端状态同步和控制,音频焦点管理等,这些都会增加复杂度。

一般的开发模式都是基于或大量借鉴开源实现,比较重要的有FFMPEG实现了大部分的音视频编解码协议, WEBRTC实现了音视频编解码处理和远程视频流以及网络管理。

2、Media3

2.1、官方简介

引用Google官网描述:

“Jetpack Media3 is the new home for media libraries that enables Android apps to display rich audio and visual experiences. Media3 offers a simple architecture with powerful customization, reliability, and optimizations based on device capabilities to abstract away the complexity that comes with fragmentation.”

可以简单解读下:

1、是Jetpack的一部分,是一个新的媒体库,以可以提供更丰富的音视频体验;

2、更简单的架构,更好的定制化、可靠性、优化能力,降低了碎片化带来的复杂度;

官方链接:https://developer.android.google.cn/guide/topics/media/media3?hl=zh-cn

2.2、MediaSession

媒体会话提供了一种多端媒体播放状态同步和控制的能力。可以通过通知、控制中心媒体面板、Google语音助手、遥控器方式控制媒体播放状态。

这样看来,和自研的媒体中心功能比较类似,媒体中心多了状态保持,歌词同步等功能。原始Mediasession支持定制的命令通道可以实现类似扩展功能。

2.3、媒体架构

1)针对视频应用,因为视频在前台才能播放,官方的建议是在单个activity中播放:

2)针对音频应用,官方的建议是在后台服务中播放:

2.4、媒体组件

Media3开始,ExoPlayer仓库合并到media中,Exoplayer独立的仓库后续不再更新和发布,ExoPlayer是Media3其中的一个组件。

大概可以作如下分类:

1、ExoPlayer组件

播放器核心组件,负责媒体数据的获取、处理和渲染,也包括了一些流媒体协议:

"androidx.media3:media3-exoplayer"

"androidx.media3:media3-exoplayer-dash"

"androidx.media3:media3-exoplayer-rtsp"

"androidx.media3:media3-exoplayer-ima"

"androidx.media3:media3-exoplayer-midi"

"androidx.media3:media3-exoplayer-workmanager"

"androidx.media3:media3-exoplayer-smoothstreaming"

DASH(MPEG-DASH):是 Dynamic Adaptive Streaming over HTTP的缩写,基于HTTP的动态自适应的比特率流技术;

RTSP(Real-Time Stream Protocol): RTSP在体系结构上位于RTP和RTCP之上, 它使用TCP或RTP完成数据传输;

IMA(互动式媒体广告 ):连接广告服务器和进行数据处理;

MIDI(Musical Instrument Digital Interface):是一个工业标准的电子通信协议,为电子乐器等演奏设备(如合成器)定义各种音符或弹奏码;

Workmanager: 后台的操作支持jetpack的workmanager;

Smoothstreaming:Microsoft Smooth Streaming (MSS) 是IIS的媒体服务扩展,用于支持基于HTTP的自适应流。

2、Session组件

"androidx.media3:media3-session"

Media session管理组件。

3、UI组件

"androidx.media3:media3-ui"

媒体播放UI组件,包括视频的surfaceview和播控UI。PlayerView类持有Player接口完成播放。

4、Datasource组件

"androidx.media3:media3-datasource"

"androidx.media3:media3-datasource-cronet"

"androidx.media3:media3-datasource-okhttp"

"androidx.media3:media3-datasource-rtmp"

Exoplayer需要指定datasource来进行数据解析。

Cronet:基于Chromium网络引擎的网络库;

OkHttp:大家所熟知的;

RTMP:(Real-Time Messaging Protocol,实时消息传输协议)是一种用于低延迟、实时音视频和数据传输的双向互联网通信协议。

5、媒体编辑相关的组件

"androidx.media3:media3-transformer"

"androidx.media3:media3-extractor"

"androidx.media3:media3-effect"

提供媒体格式转换、内容提取、渲染效果编辑接口。

6、cast组件

"androidx.media3:media3-cast"

Google投屏相关的组件。

3、Media各个版本对比

3.1、System media session service

SystemServer中实现了一个MediaSessionService,和Media3的sessionservice类名一样。

系统中的媒体播放会连接此服务向外暴露媒体会话。

public class MediaSessionService extends SystemService

Client可以通过

(MediaSessionManager) context.getSystemService(Context.MEDIA_SESSION_SERVICE)

获取会话管理接口。

这些会话会暴露给SystemUI在媒体面板上显示。

3.2、V4 Media

v4 support包中的媒体组件,包路径为android.support.v4.media。

MediaBrowserCompat支持浏览媒体,通过MediaSessionCompat管理会话,需要应用实现MediaBrowserServiceCompat服务,action为android.media.browse.MediaBrowserService。

除了媒体共享之外没有提供其他能力,早期的版本了解即可,最新的Media3兼容此方案。

3.3、Media2

media2和exoplayer是独立,两个仓库迭代开发和发布。

问题:

1)两者有较多的重复的模块,如下图所示:

2)播放器和会话之间的接口不一样,需要进行连接转换,超过50%的top应用因此产生一些问题。

3.4、Media3

1)将media2和exoplayer整合了,公共的模块合并:

2)client和server端都实现相同的接口Player,mediacontroller和exoplayer都实现了Player接口:

3)将MediaBrowserService拆分,MediaSessionService负责播放中会话管理,MediaLibraryService负责播放文件树暴露:

4)增加了一些媒体编辑的组件,前面已有介绍的。

4、统一播放器方案设计

自研的各个音乐和视频播放器都各自实现,没有统一的方案,使用的player类型和版本不一致,版本比较老旧。比如本地多媒体项目中USB播放器使用的Media3 ExoPlayer + Media session, Media session是拷贝源码方式集成,作了部分自定义修改;杜比音乐项目中有使用旧的Exoplayer2;

播放器方案见:通用MediaPlayer优化方案V1.0

5、统一播放器接入

见统一媒体播放器接入指南

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

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

相关文章

Hive 函数

分类 Hive 的函数分为两大类:内置函数(Built-in-Functions)、用户自定义函数(User-Defined-Functions);内置函数可分为:数值类型函数、日期类型函数、字符串类型函数、集合函数等;用…

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述

系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述 3.1.1 信息系统的定义3.1.1.1 信息系统3.1.1.2 信息化3.1.2 信息系统的发展3.1.2.1 初始阶段3.1.2.2 传播阶段3.1.2.3 控制阶段3.1.2.4 集成阶段3.1.2.5 数据管理阶段3.1.2.6 成熟阶段3.1.3 信息系统的分类3.…

车载音视频App框架设计

简介 统一播放器提供媒体播放一致性的交互和视觉体验,减少各个媒体应用和场景独自开发的重复工作量,实现媒体播放链路的一致性,减少碎片化的Bug。本文面向应用开发者介绍如何快速接入媒体播放器。 主要功能: 新设计的统一播放U…

Visual Studio2022中使用.Net 8 在 Windows 下使用 Worker Service 创建守护进程

Visual Studio2022中使用.Net 8 在 Windows 下创建 Worker Service 1 什么是 .NET Core Worker Service1.1 确认Visual Studio中安装了 ASP.NET和Web开发2 创建 WorkerService项目2.1 新建一个WorkerService项目2.2 项目结构说明3 将应用转换成 Windows 服务3.1 安装Microsoft.…

MySQL字符串魔法:拼接、截取、替换与定位的艺术

在数据的世界里,MySQL作为一把强大的数据处理利剑,其字符串处理功能犹如魔术师手中的魔法棒,让数据变换自如。今天,我们就来一场关于MySQL字符串拼接、截取、替换以及查找位置的奇幻之旅,揭开这些操作的神秘面纱。 介绍…

RocketMQ控制台(rocketmq-dashboard/)

RocketMQ控制台的官网:RocketMQ控制台官网 页面往下拉 用户指导 https方式访问rocketmq-dashboard

【论文阅读】MCTformer+:弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器一、介绍1.1 WSSS背景1.2 WSSS策略 二、联系工作2.1 弱监督语义分割2.2 transformers的可视化应用 三、MULTI-CLASS TOKEN TRANSFORMER3.1 Multi-class t…

书生浦语-大模型平台学习-环境搭建01

任务:完成SSH连接与端口映射并运行hello_world.py 详细步骤详见:https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Linux/readme.md 1、InternStudio介绍 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持…

超算网络体系架构-资源层-平台层-服务层-应用层

目录 超算网络体系架构 我国超算基础设施 超算互联网相关标准研制方面 技术架构 资源层 基础资源 芯片多样 体系异构 高效存储 高速互连 资源池化 可隔离 可计量 互联网络 高带宽 低时延 高安全 平台层 算力接入 资源管理 算力调度 用户管理 交易管理 模…

FLYFLOW:ANT DESIGN VUE3 版本璀璨问世

FlyFlow 介绍 官网地址:www.flyflow.cc Element Plus 演示网址:pro.flyflow.cc Ant Design 演示网址:ant.flyflow.cc 经过作者几个星期夜以继日的辛勤耕耘与不懈探索,FlyFlow 工作流框架的 AntDesign 版本终于璀璨问世&#x…

【数据结构】深入理解Floyd最短路径算法:全面解析及Python实现

文章目录 一、Floyd-Warshall算法简介二、Floyd-Warshall算法的数学表述三、Floyd-Warshall算法的Python实现四、Floyd-Warshall算法的应用场景五、Floyd-Warshall算法的优缺点六、优化与改进七、总结 Floyd-Warshall算法是一种用于解决加权图中最短路径问题的经典算法。该算法…

每日一题,力扣leetcode Hot100之49. 字母异位词分组

该题用哈希表解答,具有统一特征的作为哈希表的键名,然后满足要求的作为值 解法一: 我们将每个字符串进行排序,如果排序后的结果相同,则可以认为是字母异位词,我们将排序后的结果作为哈希表的key&#xff…

2024嘶吼网络安全产业图谱(高清完整版)

在数字化和智能化浪潮的推动下,网络安全产业正处于一个快速变革的时期。从传统的防御手段和被动的威胁应对,到如今主动预防和智能检测技术的普及,网络安全领域的焦点和需求正不断演进。为了更好的理解当前网络安全产业现状和未来发展方向&…

ubuntu安装carla9.14及carla使用记录

ubuntu18和20都可以很好的运行。不过配置需要注意一些问题罢了,我个人比较习惯20,所以就主要从ubuntu20来说。 首先听说是最好自己使用一个新的python环境来用,那就先去下载anaconda,直接去清华源下载快一些: https://…

CentOS快速安装Docker(腾讯镜像源)

这里是引用"> 1、卸载旧版本的 Docker yum list installed | grep docker yum -y remove docker-ce-cli.x86_64 yum -y remove docker-ce.x86_64 yum -y remove containerd.io2、安装相关依赖 yum install -y yum-utils device-mapper-persistent-data lvm23、添加 …

js基础-小数计算,并转换成带两位的百分比

小数计算,并转换成带两位的百分比 1、需求说明2、执行过程2.1 计算 s12.2 计算 s2 1、需求说明 在工作中,有时需要将计算的小数转换成百分比小数,但是在js代码中,计算公式一点点的区别就会影响到最终的结果,如下面代码…

下载仓颉sdk安装时遇到“无法运行”问题

图1. 社区地址:GitCode - 全球开发者的开源社区,开源代码托管平台 在GitCode社区中下载Cangjie-0.53.4-windows_x64的sdk后,双击安装时遇到“此应用无法在你的电脑上运行的问题” 经过反复排查后,确定是sdk直接下载有问题;‘需要…

《电脑与电信》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问:《电脑与电信》是不是核心期刊? 答:不是,是知网收录的第一批认定学术期刊。 问:《电脑与电信》级别? 答:省级。主管单位:广东省科学技术厅 主办单位&#xff1a…

解决C#读取US7ASCII字符集oracle数据库的中文乱码

👨 作者简介:大家好,我是Taro,全栈领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、解决方法二、安装System.Data.OleDb连接库三…

vue 实现下拉框的数据是树状结构

页面显示效果 vue实现代码 <el-form-item label"公司名称" prop"comName"><el-select ref"select" v-model"queryParams.comName" placeholder"请选择公司名称" clearable size"small"change"handl…