[源码] Eoxplayer主框架流程
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:
- 计算audiotrack的bufferSize
- 记录写进audiotrack的bytes,writtenPcmBytes
- 通过AudioTrack::getPlaybackHeadPosition,获取当前播到的frames,推算出getAvailableBufferSize
- 根据AvailableBuffer决定是否送进去,实现低api也不会block
[源码] Eoxplayer主框架流程相关推荐
- Spring源码——声明式事务流程
前言 最近回顾了一下Spring源码,准备用思维导图的方式简单的将整个源码内容的流程展示出来,思维导图.图片等文件更新在https://github.com/MrSorrow/spring-frame ...
- Retrofit2源码解析——网络调用流程(下)
Retrofit2源码解析系列 Retrofit2源码解析(一) Retrofit2源码解析--网络调用流程(上) 本文基于Retrofit2的2.4.0版本 implementation 'com. ...
- android 输入法如何启动流程_android输入法02:openwnn源码解析01—输入流程
android 输入法 02:openwnn 源码解析 01-输入流程 之后要开始 android 日文输入法的测试,因此现在开始研究 android 输入法.之前两 篇文章已经对 android 自 ...
- 【Flink】 Flink 源码之 SQL 执行流程
1.概述 转载:Flink 源码之 SQL 执行流程 2.前言 本篇为大家带来Flink执行SQL流程的分析.它的执行步骤概括起来包含: 解析.使用Calcite的解析器,解析SQL为语法树(SqlN ...
- Plugin工具类-Unreal4源码拆解-UnrealBuildTool功能流程解析
Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin 知乎专栏:UBT源码解析 4.2x功能不会差太多 主要功能 Plugin静态类,功能上大致是一个工具类,根据文件夹保存 ...
- Android 11.0 Settings源码分析 - 主界面加载
Android 11.0 Settings源码分析 - 主界面加载 本篇主要记录AndroidR Settings源码主界面加载流程,方便后续工作调试其流程. Settings代码路径: packag ...
- dubbo源码解析之框架粗谈
dubbo框架设计 一.dubbo框架整体设计 二.各层说明 三.dubbo工程模块分包 四.依赖关系 五.调用链 文章系列 [一.dubbo源码解析之框架粗谈] [二.dubbo源码解析之dubbo ...
- 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 初始化
MediaRecorder 用于录制音频和视频,录制控制基于一个简单的状态机.下面是典型的使用 camera2 API 录制,需要使用到的 MediaRecorder API. MediaRecord ...
- openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)Compositor comp_main client compositor
monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码 ...
最新文章
- ccf Markdown
- 三分钟了解“Java重写”
- windows 自动化目录大纲(各企业架构不一样,按需选择)
- Cytoscape: MCODE增强包的网络模块化分析
- 【iOS UIKit】UITableView属性及方法大全
- Linux 定时清除日志 Log
- 【Groovy】MOP 元对象协议与元编程 ( 方法注入 | 使用 Category 分类注入方法 )
- BZOJ 3907: 网格( 组合数 + 高精度 )
- 随机数归并排序c语言,用C语言实现归并排序
- 小程序接口学习—开发接口
- python logging打印终端_想知道Python如何在终端上打印表格吗?两行代码告诉你!
- mysql s授权所有用户_查看MYSQL数据库中所有用户及拥有权限
- 【知识图谱系列】基于2D卷积的知识图谱嵌入
- MQTT SSL加密单双向认证
- animation动画不生效_css animation不动怎么办
- vue 中引入阿里云的云盾防水墙
- centos8安装配置web服务器
- iPhone屏幕分辨率
- Java SSM 项目实战 day08 方法级别的权限操作 服务器端的权限控制(JSR-250注解)(支持表达式的注解)(@Secured)以及页面端的权限控制
- ChatGPT登上Time封面!这场竞赛,OpenAI赌赢了
热门文章
- java输出值_java输出一个值的绝对值怎么编写?
- Prepar3D飞行模拟器中的飞机是怎么制作的?
- 华为OD机试真题 C++ 实现【任务调度】【2022.11 Q4 新题】
- 【Qt】QTimer的简单使用
- mysql econnreset_如何在Node.js中调试错误ECONNRESET?
- mathematica 学习笔记
- premiere版本和对应操作系统
- android最强平板,最强Android平板 Galaxy Tab S3体验评测
- C 语言函数作业,c语言函数练习题附答案
- 如何使用odoo的compute方法,自动计算odoo字段