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,一经查实,立即删除!

相关文章

《学会 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,算上各种生僻字差不多六万字 仍然使用一个大表格,给每个汉字,分配一个整数即可。 字符集~~表示汉字的字符集&#…

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秒后就能返回结果。但是在高峰期,如果有两万…

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)。 自定义搜索命令是一个可执行文件,可读入和写出数据,它可以是一…

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

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

Qt窗口程序整理汇总

到今日为止,通过一个个案例的实验,逐步熟悉了 Qt6下 窗体界面开发的,将走过的路,再次汇总整理。 Qt Splash样式的登录窗https://blog.csdn.net/castlooo/article/details/140462768 Qt实现MDI应用程序https://blog.csdn.net/cast…

基于单片机STC89C52和GSM实现的远程拨号开锁设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于单片机STC89C52和GSM实现的远程拨号开锁设计的详情介绍,如果对您有帮助的话,还请关注一下哦,如果有资源方面的需要可以联系我。 目录 摘要 仿真图 单片机系统流程图 实物图 代码 系统论文 资源下载 摘要 本文介…

python数据可视化(9)——绘制小提琴图

课程学习来源:b站up:【蚂蚁学python】 【课程链接:【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接:【链接】】 python:3.12.3 所有库都使用最新版。 Python绘制小提琴图 小提琴图(violin plot…

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备: 任意markdown编辑器,以typora为例pandoc,官方下载地址 思路整理: 从swagger提取离线md文档将md文档转换为word格式 操作步骤: 一、安装pandoc (markdown编辑器安装略) 前往官网…

Yak与nuclei的深度融合:打造高效漏扫生态,解锁PoC管理新姿势

在Yakit中使用nuclei很简单,只需要几行代码。在Yak Runner中,使用下面代码,指定扫描的目标与选项,便能调用nuclei的漏扫能力: results:nuclei.Scan(target,opts...)~for result in results { dump(result)} 比如以…

UNiapp微信小程序Ucharts

效果图如下 以上为加载接口所得数据的玫瑰图与折线图 具体步骤如下 1,将插件导入Hbuiler 所需要的项目中(插件地址:秋云 ucharts echarts 高性能跨全端图表组件 - DCloud 插件市场) 2,导入成功是这样的 3&#xff0c…

相对定位语法:css+xpath基础语法使用-定位页面元素

文章目录 CSS相对定位获取元素关系定位顺序关系 XPath相对定位基础语法顺序关系-通过索引获取元素选取元素 总结 ✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味&#xff0c…

uniapp小程序上传pdf文件

<template><view class="mainInnBox"><view class="formBox"><!-- 注意,如果需要兼容微信小程序,最好通过setRules方法设置rules规则 --><u-form :model="form" ref="uForm" :rules="rules"&g…