ExoPlayer结构分析

2023-11-15

最近要做音乐播放器,经过一周的调研,最终决定使用google的ExoPlayer,对ExoPlayer的架构、流程做个分析,梳理一下调用逻辑。

先做个笔记,等项目做完了写一个多媒体播放的大型攻略。

媒体资源的获取

MediaSource类代表媒体资源,new出这个类的实例需要uri,DataSourceFactory和ExtractorsFactory。

uri是资源的路径;

DataSourceFactory的作用是创建对应的DataSource实例,从uri资源中读取文件流;

ExtractorsFactory的作用是创建Extractors实例,Extractor翻译过来就是“抽出器”,在这里就是把媒体文件从二进制的媒体流中抽出来。这个开源项目已经实现了mp3/mp4/flv等常见格式的抽出器,如果需要解析不支持的格式,还可以自己实现,或使用ffmpeg扩展。

MediaSource是一个接口,也没声明几个方法,其中最主要的一个就是createPeriod()方法,用来创建一个MediaPeriod对象,这个对象就是真正做资源处理的。

对媒体资源的使用

ExoPlayer类代表这“播放器”的概念,就是接收媒体资源,把媒体资源解析成声音和画面呈现出来。ExoPlayer是一个接口,它有很多实现,我们以SimpleExoPlayer为例子。new出一个SimpleExoPlayer实例需要RenderersFactory、TrackSelector和LoadControl三个参数。

RenderersFactory是用来生产Renderer数组的。Renderer翻译过来就是渲染器的意思,就是把音频、视频、文字源显示在画面上或输出成声音。音视频文件的录制都是二进制的,只是时间间隔非常短,所以输出时让人感觉是连续的,而Renderer的工作就是“快速、连续地输出这些文件”。为什么是数组呢,因为一个媒体文件可能有音频、视频等多个轨道,一个Render对应一个轨道;

TrackSelector翻译过来就是轨道选择器的意思,它在这里的作用就是轨道选择,它有个方法selectTracks(),返回TrackSelection数组,TrackSelection就是对轨道进行解析的。一个媒体文件会包含多个轨道,音轨、视频轨、文字轨等,所以需要多个TrackSelection;

LoadControl主要是解析的一些进度控制、参数控制等,主要是记录一些position;

整个播放逻辑流程

上面分析了资源的获取和资源的使用,现在就分析下ExoPlayer是如何启动整个流程、控制整个流程的。

ExoPlayer通过prepare(MediaSource m,xxx,xxx)方法启动,方法里面调用ExoPlayerImpl的prepare方法,里面又调用ExoPlayerImplInternal的prepare方法,这个类就是真正的逻辑实现。

ExoPlayerImplInternal里面会通过Handler发送MSG_PREPARE消息,然后最终会调用prepareInternal方法。这个方法里面进行一些初始化操作后,就会发送MSG_DO_SOME_WORK消息,最终调用doSomeWork方法。

doSomeWork方法里首先会调用updatePeriods方法更新Period。播放由三个MediaPeriodHolder实例控制,MediaPeriodHolder是什么呢?它持有MediaPeriod、MediaSource、Render等所有实例,这里面就是真正完成所有逻辑的。这三个实例分别是loadingPeriodHolder、readingPeriodHolder和playingPeriodHolder。

updatePeriods方法会调用setPlayingPeriodHolder方法,设置将要播放的MediaPeriod。setPlayingPeriodHolder方法最后会调用enableRenderers方法,该方法会遍历render数组(创建ExoPlayer实例时传入的参数),调用render的start方法,这里面会执行一些状态的重置、通知。

然后再回到doSomeWork方法,接着往下走,会调用render的render方法,这个方法就是真正的解析、渲染了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ExoPlayer结构分析 的相关文章

  • BLE 外设支持 Android-L 示例 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我希望有一个适用于 Android L 的 BLE 外设模式的示例 我的代码给了我奇怪的错误 即广告商太多 这没有任何意
  • 处理 Android 锁屏上的音量变化?

    我想做的是 能够在 android 4 4 上的锁屏上捕获音量增大 减小按钮操作 Google Cast 设计清单 https developers google com cast docs design checklist sender
  • Android Manifest 自动生成无效权限

    我不小心在 Android 清单中输入了无效的权限名称 并且无法将其删除 这是我的清单代码
  • Android向后兼容技术

    我现在在开发基于最新 API 15 ICS 的 15 项活动 Android 应用程序方面取得了进展 现在我发现应用程序的主要功能主义者即使支持 android v4 也不向后兼容 例如 1 fragment事务动画 2 将StringSe
  • 编译后从字节代码中删除注释

    我们正在使用一个包含使用 JAXB 注释进行注释的 bean 的库 我们使用这些类的方式完全不依赖于 JAXB 换句话说 我们不需要 JAXB 也不依赖注释 但是 由于注释存在 它们最终会被处理注释的其他类引用 这要求我将 JAXB 捆绑到
  • 如何将 Android Instrumentation 测试推送到模拟器/设备?

    我正在尝试使用 Ubuntu 9 04 中的命令行 shell 在 Android 模拟器上运行 Webkit 布局测试 adb s emulator 5554 shell am instrument w com android dumpr
  • 维护 HttpUrlConnection 调用之间的会话(Native/Webview)

    让我从我做的开始desire 我想制作一个应用程序part native and part webviews Problem 维护本机和 webview 部分之间的会话 My 处理方法 this 我打算实现一个本机登录 其中我向用户展示两个
  • 从 BroadcastReceiver 获取方法来更新 UI

    我正在尝试根据变量的变化更新用户界面BroadcastReceiver 因此 我需要调用一个扩展类的方法 以获取我提到的变量 BroadcastReceiver in MainActivity取决于但我无法以任何方式获得真正的返回值 扩展的
  • FLAG_ACTIVITY_REORDER_TO_FRONT 被忽略

    我有一个包含项目列表的 FragmentActivity 当应用程序处于后台时 可以推送该项目列表 发生这种情况时 我想创建一个状态栏通知并提醒用户更新 当用户单击通知时 活动应重新排序到前面并显示在屏幕上 同时在列表底部显示新项目 所以我
  • 多语言 Android 应用程序:在电子邮件和密码字段中显示英文键盘

    我们正在开发一款多语言 Android 应用程序 针对英语和阿拉伯语 面临的问题是在登录和注册屏幕中 我们希望仅以英文文本输入用户名和密码字段 从而显示英文键盘 无论设备区域设置语言如何 已尝试在 edittext 中设置 inputtyp
  • 使用 RxJava 限制吞吐量

    我现在遇到的情况很难解释 所以我会写一个更简单的版本来解释这个问题 我有一个Observable from 它发出一系列由ArrayList文件数量 所有这些文件都应上传到服务器 为此 我有一个函数可以完成这项工作并返回一个Observab
  • Spotify 登录错误 INVALID_CLIENT:无效的重定向 URI android

    我正在制作一个包含 Spotify 集成的应用程序 我点击了此链接https developer spotify com technologies spotify android sdk tutorial https developer s
  • 如何在Android网格视图中设置单元格大小?

    我正在尝试为应用程序制作一个带有大图标的网格视图 但我找不到任何有关修改 Android 上网格布局上的单元格大小的教程 有人可以给我一个例子或相关链接吗 Thanks 就像另一个一样适配器视图 http developer android
  • BitmapFactory.decodeResource() 忽略 jpg 图像的 inPreferredConfig 选项

    我尝试将jpeg资源图像加载到ARGB 8888格式的位图 BitmapFactory Options opts new BitmapFactory Options opts inPreferredConfig Bitmap Config
  • 从Android客户端登录appengine

    我正在尝试登录应用程序引擎并访问应用程序引擎中的用户服务API 基本上我希望能够看到谁登录了我的 servlet 我正在使用从 android 获取 authtoken 然后从应用程序引擎获取 ASID 或 SACID cookie 的身份
  • SDK尚未初始化,请务必先调用FacebookSdk.sdkInitialize()

    我在实现 Facebook SDK 时遇到此错误 并且我tried https stackoverflow com questions 15490399 error inflating class com facebook widget l
  • 动态创建 JSON 对象

    我正在尝试使用以下格式创建 JSON 对象 tableID 1 price 53 payment cash quantity 3 products ID 1 quantity 1 ID 3 quantity 2 我知道如何使用 JSONOb
  • 制作弹跳动画

    我想做图层的弹跳动画 我已经完成了该图层从右到中心的操作 现在我想将其向后移动一点 然后回到中心 这会产生反弹效果 我想我可以用这样的翻译来做到这一点
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • Android Espresso - 如果未选中,请单击复选框

    I have onView withId R id check box perform click 但我只想在尚未选中该复选框时执行此操作 我怎样才能在浓缩咖啡中做到这一点 我还想根据其之前的状态来切换复选框 开关 起初 我尝试用此方法打开

随机推荐

  • HJ212-Pack HJ212协议组包实现

    HJ212 Pack HJ212协议组包实现 仓库地址 https gitee com ll0 0ll HJ212 Pack HJ212协议认识 https blog csdn net lblmlms article details 108
  • STM32定时器----TIMx->SR寄存器

    在研究stm32定时器时发现 当进入定时器的中断时 定时器计数器以及中断接收时正常运行的 并没有因为进入中断而停止 具体看以下分析 定时器初始化代码 TIM捕获通道开启宏定义 1 开启 0 关闭 define TIM ICCH1 1 def
  • Vite热更新不起作用

    错误示例 path show component gt import views Show index vue show 目录名 注意路由中是大写开头 这里是小写的 这就是问题所在 Index vue 文件名 这样写目录名或文件名与路由中写
  • Windows10 搭建vs2017OpenGL ES 3.0 开发环境

    前言 更新于2021 06 29 1 首先下载 OpenGL ES 3 0 Programming Guide 随书源码 直接使用CMake工具生成vs2017代码工程 然后使用vs2017打开工程 ES3 Book sln 然而 vs报错
  • mysql多对一、多对多查询实践

    最近做的功能涉及这方面 算是练了一下 首先多对一部分较简单 多的那一方表 多设置一个字段是少的那一方的id 主键 具体查询时候关联查询即可 可设置外键进行级联操作 具体以后做到这个功能再更新 多对多 设备和用户多对多 一个用户可有多台设备
  • 用java编写赛马_java applet 赛马小程序

    昨天写看java书的时候 觉得闷 就写了个小程序自我娱乐一下 技术含量不高 只是自我娱乐而已 下面的代码只要编译出class文件 再写一个HTML格式的文件 调用Arc2Demo2 class 就能看了 该程序实现一个跑马比赛程序 各个选手
  • Translucent System Bar 的最佳实践

    Translucent System Bar 的最佳实践 http mp weixin qq com s biz MzA3MDMyMjkzNg mid 2652262235 idx 1 sn f7ebd354b2ad04064d27e0df
  • 【Docker】基于docker构建深度学习开发环境

    文章目录 1 选择基础镜像 1 1 不同深度学习框架对CUDA和cuDNN的要求 1 2 显卡驱动对CUDA的要求 1 3 深度学习框架对CUDA不同版本要求冲突的解决 2 创建容器并进行基础配置 2 1 创建容器并查看CUDA和cuDNN
  • 某网站面试算法题,今天碰到了,两个大数字相加(足够大)取和

    两个大数相加 1 是整数 2 两个数无限大 long都装不下 3 不能用BigInteger 4 不能用任何包装类提供的运算方法 5 两个数都是以字符串的方式提供 面试答卷直接写下 此处空白位置太小 写不下 请求机试 果然给我一台应该是 爬
  • Spring 循环依赖的三级缓存

    在Spring Bean 的生命周期中 里面有一步就是填充属性 而填充属性之前会判 属性对象是否被当前对象循环依赖 当发现属性对象被循环依赖的时候会进行aop 被命中 并且生成属性对象的代理对象 未命中目标对象 循环依赖是如何形成的 当 对
  • 基于PSIM及其DLL模块的单相全桥并网逆变器仿真

    摘要 本文简单地介绍了单相全桥并网逆变器的闭环控制原理 利用PSIM软件来进行仿真实验 关键词 单相 闭环控制 PSIM DLL 锁相环 过零检测 进网电流反馈 SPWM 因在研究过程中参考的不少文献忘记标记了 所以无法一一列出 如有侵权
  • 【elasticsearch】ES 单分片使用 From/Size 分页遇到重复数据

    1 概述 ES 单分片使用 From Size 分页遇到重复数据 常规情况下 ES 单分片使用 From Size 是不会遇到数据重复的 数据重复的可能原因有 没有添加排序 添加了按得分排序 但是查询语句全部为 filter 过滤条件 此时
  • SpringSecurity常见面试题汇总(超详细回答)

    1 什么是Spring Security 核心功能 Spring Security是一个基于Spring框架的安全框架 提供了完整的安全解决方案 包括认证 授权 攻击防护等功能 其核心功能包括 认证 提供了多种认证方式 如表单认证 HTTP
  • Android的关于高德地图加载谷歌瓦片,并缓存本地的功能.

    最近开发的Android的App需要使用到卫星图 不过发现国内现有的百度 高德的卫星图对郊区图层支持的不好 只能使用谷歌的卫星图 在尝试使用谷歌的Google Map API for Android后又发现去要手机安装谷歌服务 并且有可能用
  • batchsize的选择和学习率调整

    batchsize的选择和学习率调整 增大Batch Size的好处 数据的处理速度加快 跑完一次 epoch 全数据集 所需的时间减少 在一定范围内 一般来说 Batch Size 越大 其确定的下降方向越准 引起训练震荡越小 尤其是网络
  • Angular学习笔记70:Angular项目的单元测试 -- 对组件进行测试

    对组件进行测试 对组件绑定的测试 例如在一个组件中 一个组件中模版里有一个标题的是 h2 class title title h2 组件的类文件中对应绑定了一个类文件中的属性 测试这个绑定的数据 it should render title
  • 华为云空间費用_华为云空间有什么用

    华为云空间是专门用于存储联系人 备忘录 照片 录音 云盘的 它还可以使用查找手机功能 其性质和云存储空间类似 手机用户可以将通讯录 照片或视频 录音以及其他资料存放在这里 而在其他的华为设备上登录云空间账号后 即可将这些信息同步到其他设备上
  • 渗透测试学习22:业务逻辑漏洞

    目录 登录认证模块 未授权访问和越权 验证码相关问题 支付漏洞 活动相关 薅羊毛 密码找回模块 登录认证模块 万能密码 现在很少了 但也可以试试 例子 admin or 1 1 弱口令 社工尝试获取账号 并构造密码库 明文密码传输 edu常
  • 我的LaTeX入门

    第一次打美赛就用了latex 比赛前刷了各种博客 学习了1天就上场 美赛期间全程扮演不同角色 就是打杂的 大家都是第一次参加 都很累 不过我是最累的 两天两夜没睡 建模 编程 latex写论文全程参与 用latex写论文真的是太爽了 闲着也
  • ExoPlayer结构分析

    最近要做音乐播放器 经过一周的调研 最终决定使用google的ExoPlayer 对ExoPlayer的架构 流程做个分析 梳理一下调用逻辑 先做个笔记 等项目做完了写一个多媒体播放的大型攻略 媒体资源的获取 MediaSource类代表媒