Android Media3 技术应用详解

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.mzph.cn/bicheng/47278.shtml

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

相关文章

模拟考题目总结

嘤嘤的子串权值和 考虑枚举左端点跑 d p dp dp,状态 [ i , j ] [i,j] [i,j] 表示当前在字符串第 i i i 位匹配到第 j j j 位。 发现转移方程跟左端点无关,当右端点为 x x x 时,可选的左端点有 x x x 个,当 s i a s_ia s…

《学会 SpringBoot · 定制 SpringMVC》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 近期刚转战 CSDN,会严格把控文章质量,绝不滥竽充数,如需交流&#xff…

元宇宙深入解析

元宇宙(Metaverse)是一个新兴的概念,它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿,提供了一个平行的数字宇宙,用户可以在其中实时互动,超越物理世界的限制。 元宇宙是什么&am…

一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取 点击注册🔗开通七牛开发者帐号如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key 2. Node.js获取七牛token 安装qiniu npm install qiniu创建空间 Node获取token const qi…

美国INSTRUMENTS的L2/L6/L10/L20/L50线性放大器与ATA-L水声放大器

一、企业背景: Aigtek是一家来自中国的专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大学的专家教授等联合组成研发团队,目前…

QT开发笔记:信号和槽

乱码问题: 出现乱码问题原因只有一个:就是编码方式不匹配!!! 中文常见汉字4K,算上各种生僻字差不多六万字 仍然使用一个大表格,给每个汉字,分配一个整数即可。 字符集~~表示汉字的字符集&#…

python 语法学习 day 7

错题反思 1.九九乘法表 第一次提交的答案是:先把所有输入值放在列表里面 EOF,输入后产生异常-->>捕获异常,结束输入 3. 题意:统计单词的种类以及数量(忽略大小写),最终以降序输出(出现次数相同的单词根据单词的…

板级调试小助手(4)基于C语言的自定义脚本解析器

一、前言 在之前的文章中介绍了板级调试小助手的结构、DDS外设以及如何使用PYNQ驱动OLED显示视频,在小助手结构的文章中提到,小助手具有自定义脚本功能,这个功能是使用C语言编写的,本质上来说就是一个字典树通过读取脚本的关键词进…

Laravel表单验证的艺术:精细控制数据的入口

Laravel表单验证的艺术:精细控制数据的入口 在Web应用开发中,表单请求验证是确保接收到的数据满足特定条件的重要环节。Laravel框架提供了一套强大且易于使用的验证系统,允许开发者定义复杂的验证规则并轻松地应用到表单请求上。本文将深入探…

Go 语言中的互斥锁 Mutex

Mutex 是一种互斥锁,名称来自 mutual exclusion,是一种用于控制多线程对共享资源的竞争访问的同步机制。在有的编程语言中,也将其称为锁(lock)。当一个线程获取互斥锁时,它将阻止其他线程对该资源的访问,直到该线程释放锁。这可以防止多个线程对共享资源进行冲突访问,从而…

FPGA实训报告DAY 1(Verilog HDL)

实习日志与总结 日期:2024 年 7 月 10 日 星期三 姓名:XXX 一、实习日志 上午 9:00 - 9:30 按时到达工位,参加部门早会,了解了今天的实习任务和目标,即初步学习 FPGA 简介和 Verilog 基础语法知识。 9:30 - 10:30…

LeetCode-随机链表的复制

. - 力扣(LeetCode) 本题思路: 首先注意到随机链表含有random的指针,这个random指针指向是随机的;先一个一个节点的拷贝,并且把拷贝的节点放在拷贝对象的后面,再让拷贝节点的next指向原链表拷贝…

免分助手神器-交管12123学法减分模拟考试题目及答案 #经验分享#其他

“驾照学法减分”为驾驶人提供了一种积极参与交通安全事业、减缓驾驶证扣分的方式,有益于促进驾驶人形成遵守交通规则、规范驾驶行为的良好习惯,提高道路交通安全意识和素养。然而,持有人仍需严格遵守道路交通安全法律法规,减少交…

1.MQ介绍

MQ 消息队列,本质是一个队列,先进先出,只不过队列中存放的内容是message而已。 为啥学习MQ 1.流量消峰 如果一个订单系统最多每秒能处理一万次订单,正常情况下我们下单1秒后就能返回结果。但是在高峰期,如果有两万…

服务端正常启动了,但是客户端请求不到

服务端正常启动了,但是客户端请求不到有哪些原因?如何排查? 如果客户端请求的接口没有响应,排查的方式: 检查接口IP地址是否正确,ping一下接口地址。 检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1",选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机,比如我选择的是192.168.0.104: 结果提示:Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

splunk编写自定义命令

1. 自定义命令简介 splunk有丰富的内置搜索命令,但也提供了编写自定义命令来实现个性化的搜索需求,以此方式扩展splunk搜索处理语言(SPL)。 自定义搜索命令是一个可执行文件,可读入和写出数据,它可以是一…

状态机和工作流的选择

结论 如果你的需求主要集中在状态管理和状态转换控制,并且你使用的是Spring生态系统,Spring State Machine 是一个非常合适的选择。 如果你的需求是企业级的业务流程自动化,涉及到跨系统、跨组织的业务协调,并且需要强大的流程设计…

办公效率翻倍!2024最适合办公电脑安装的系统推荐!

当前,电脑已成为我们日常办公最常用的工具。为了确保高效顺畅的办公体验,选择一款合适的操作系统至关重要。那么,如何找到并下载最适合办公电脑的操作系统呢?接下来系统之家小编为您推荐2024年最适合办公电脑安装的系统&#xff0…

递推算法及解题套路

数学归纳法 step 1: 验证k0成立 step 2: 验证如果ki成立,那么ki1也成立 step 3: 联合step1与step2,证明由k0->kn成立 如何解决递推问题 1.确定递推状态 一个函数符号f(x),外加这个函数符号的含义描述 一般函数所对应的值,就是…