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结构分析 的相关文章

随机推荐

  • 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类代表媒