Eoxplayer主框架流程

  • 核心流程
  • playing流程
  • AudioTrack调用

核心流程


主要流程:

  • 采用1个线程Loop实现音/视频的解码渲染。(通常做法是把音视频各用1个线程去解码渲染,各不影响,刚看到还是挺意外的)
  • message queue处理控制命令,上报的消息。

主要类:

  • ExoPlayerImplInternal:管理source,render和播放流程。
  • Mediasource MediaPeriod:url数据下载,extractor,解复用。
  • MediaCodecRenderer: 包括了解码和渲染。

playing流程

Loop:
ExoPlayerImplInternal::doSomeWork {updatePeriods();        //Period 准备for (Renderer renderer : enabledRenderers) {        //audio video renderMediaCodecRenderer::render()while () {drainOutputBuffer()     //从解码器取帧,然后渲染codec.queueOutputBuffer()processOutputBuffer()       //渲染}while () {feedInputBuffer()   //送入解码器codec.queueInputBuffer()BaseRenderer::readSource()            //从mediasource读frameProgressiveMediaPeriod::readData()}}
}
  • loop的代码流程如上,每次loop依次去调用render
  • render中会去mediaPeriod read解复用的帧,放入解码器。每次调用不一定会渲染,可能会解码还没完成,或者等同步sleep。
  • 主要的2个线程:ExoPlayerImp的loop, mediaSource下数据解复用放到sampleQueue

AudioTrack调用

单Loop刚开始会有疑问:怎么解决audiotrack write接口block的问题(sdk < 21),接口block会影响到视频的渲染。

    if (Util.SDK_INT < 21) { // isInputPcm == true// Work out how many bytes we can write without the risk of blocking.int bytesToWrite = audioTrackPositionTracker.getAvailableBufferSize(writtenPcmBytes);if (bytesToWrite > 0) {bytesToWrite = Math.min(bytesRemaining, bytesToWrite);bytesWritten = audioTrack.write(preV21OutputBuffer, preV21OutputBufferOffset, bytesToWrite);if (bytesWritten > 0) {preV21OutputBufferOffset += bytesWritten;buffer.position(buffer.position() + bytesWritten);}}}

相关类: DefaultAudioSink.writeBuffer
对于sdk < 21,audio track write会block,通过估计audiotrack的buffer来避免block:

  1. 计算audiotrack的bufferSize
  2. 记录写进audiotrack的bytes,writtenPcmBytes
  3. 通过AudioTrack::getPlaybackHeadPosition,获取当前播到的frames,推算出getAvailableBufferSize
  4. 根据AvailableBuffer决定是否送进去,实现低api也不会block

[源码] Eoxplayer主框架流程相关推荐

  1. Spring源码——声明式事务流程

    前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...

  2. Retrofit2源码解析——网络调用流程(下)

    Retrofit2源码解析系列 Retrofit2源码解析(一) Retrofit2源码解析--网络调用流程(上) 本文基于Retrofit2的2.4.0版本 implementation 'com. ...

  3. android 输入法如何启动流程_android输入法02:openwnn源码解析01—输入流程

    android 输入法 02:openwnn 源码解析 01-输入流程 之后要开始 android 日文输入法的测试,因此现在开始研究 android 输入法.之前两 篇文章已经对 android 自 ...

  4. 【Flink】 Flink 源码之 SQL 执行流程

    1.概述 转载:Flink 源码之 SQL 执行流程 2.前言 本篇为大家带来Flink执行SQL流程的分析.它的执行步骤概括起来包含: 解析.使用Calcite的解析器,解析SQL为语法树(SqlN ...

  5. Plugin工具类-Unreal4源码拆解-UnrealBuildTool功能流程解析

    Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin 知乎专栏:UBT源码解析 4.2x功能不会差太多 主要功能 Plugin静态类,功能上大致是一个工具类,根据文件夹保存 ...

  6. Android 11.0 Settings源码分析 - 主界面加载

    Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...

  7. dubbo源码解析之框架粗谈

    dubbo框架设计 一.dubbo框架整体设计 二.各层说明 三.dubbo工程模块分包 四.依赖关系 五.调用链 文章系列 [一.dubbo源码解析之框架粗谈] [二.dubbo源码解析之dubbo ...

  8. 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 初始化

    MediaRecorder 用于录制音频和视频,录制控制基于一个简单的状态机.下面是典型的使用 camera2 API 录制,需要使用到的 MediaRecorder API. MediaRecord ...

  9. openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...

最新文章

  1. ccf Markdown
  2. 三分钟了解“Java重写”
  3. windows 自动化目录大纲(各企业架构不一样,按需选择)
  4. Cytoscape: MCODE增强包的网络模块化分析
  5. 【iOS UIKit】UITableView属性及方法大全
  6. Linux 定时清除日志 Log
  7. 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
  8. BZOJ 3907: 网格( 组合数 + 高精度 )
  9. 随机数归并排序c语言,用C语言实现归并排序
  10. 小程序接口学习—开发接口
  11. python logging打印终端_想知道Python如何在终端上打印表格吗?两行代码告诉你!
  12. mysql s授权所有用户_查看MYSQL数据库中所有用户及拥有权限
  13. 【知识图谱系列】基于2D卷积的知识图谱嵌入
  14. MQTT SSL加密单双向认证
  15. animation动画不生效_css animation不动怎么办
  16. vue 中引入阿里云的云盾防水墙
  17. centos8安装配置web服务器
  18. iPhone屏幕分辨率
  19. Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制
  20. ChatGPT登上Time封面!这场竞赛,OpenAI赌赢了

热门文章

  1. java输出值_java输出一个值的绝对值怎么编写?
  2. Prepar3D飞行模拟器中的飞机是怎么制作的?
  3. 华为OD机试真题 C++ 实现【任务调度】【2022.11 Q4 新题】
  4. 【Qt】QTimer的简单使用
  5. mysql econnreset_如何在Node.js中调试错误ECONNRESET?
  6. mathematica 学习笔记
  7. premiere版本和对应操作系统
  8. android最强平板,最强Android平板 Galaxy Tab S3体验评测
  9. C 语言函数作业,c语言函数练习题附答案
  10. 如何使用odoo的compute方法,自动计算odoo字段