竹杖芒鞋轻胜马

ExoPlayer 源码分析 五 码率自适应

本文基于 ExoPlayer 2.13.2 版。 带宽预估 DASH 和 Hls 都可以提供不同码率的流,ExoPlayer 使用 BandwidthMeter 来计算带宽,它的默认实现是 DefaultBandwidthMeter 。 public interface BandwidthMeter extends TransferListener { public interf...

ExoPlayer 源码分析 四 缓存策略

本文基于ExoPlayer 2.13.2 版。 ExoPlayer 通过 LoadControl 控制缓存: LoadControl loadControl = new DefaultLoadControl(new DefaultAllocator(BUFFER_SEGMENT_SIZE)); ChunkSampleSource videoSampleSource = new Chun...

ExoPlayer 源码分析 三 变速播放

本文基于 ExoPlayer 2.13.2 版。 变速播放 视频变速 音视频同步以音频为主时钟的情况下,视频变速基本上不需要做任何处理,这点不理解的可以看我 ijkplayer 源码分析 中倍速播放的部分。 音频变速 音频变速主要有三种方式: 使用 soundtouch 处理音频,实现变速。 使用 sonic 处理音频,实现变速。 直接给 AudioTrack 设置 Pl...

ExoPlayer 源码分析 二 类图 & 名词解释

本文基于 ExoPlayer 2.13.2 版。 线程相关 LoadTask LoadTask 实现了 Runnable 接口,而且同时继承了 Handler ,它有三个作用: 通过 Loadable 加载数据—— run 方法中调用 Loadable 的 load 方法。 load 完成之后通过 handler 通知 callback。 加载过程中如有异常发生,通知 ...

ExoPlayer 源码分析 一 HLS 拉流及播放流程分析

本文基于 ExoPlayer 2.13.2 版。 本文将从 HLS 入手快速的分析一下 ExoPlayer 各个组件的作用以及 HLS 从拉流到播放的整个流程。 HLS 拉流播放步骤 下载并解析 m3u8 文件内容 拉流 2.1 加载视频流 2.2 加载音频流(如果有) 解封装 解码 4.1 视频解码 4.2 音频解码 同步播放 先把整体流程列出来是为了带着问题...

ijkplayer 源码分析

ijkplayer 基于 FFMpeg 的 ffplay,本文将结合源码分析一下 ijkplayer 的基础实现,如果不了解 FFMpeg 的,建议先看一下 FFMpeg。 播放器基本流程如下: 播放器创建 IJKMediaPlayer.initPlayer jikplayer_jni.IjkMediaPlayer_native_setup ijkplayer_android....

Flutter-7 Binding 以及各种 Tree

前言 前面分析渲染流程的时候看到了 SchedulerBinding、RendererBinding 等各种 Binding 以及 WidgetTree、ElementTree 等四种 Tree。那么这些 Binding 是什么时候被初始化的,这些 Tree 的根部在哪里,它们的叶子节点什么时候绑定到根部的,让我们来看下。 runApp runApp 是整个程序的入口,我们从它开始,代码...

Flutter-6 渲染流程——needsCompositing

前言 前面分别分析了 Flutter 渲染流程中的 build、layout 和 paint 等。还有一个阶段我跳了过去。 @protected void drawFrame() { assert(renderView != null); pipelineOwner.flushLayout(); //这个阶段到底做什么 pipelineOwner.flus...

Flutter-5 渲染流程——animation

动画我们简单说一下,只说它的原理,不跟踪代码。 回顾 我们先来回顾一下 Android 原生动画是怎么做的,无论补间动画或属性动画它都有这样几个属性: 开始状态(View 的属性或数值) 结束状态(View 的属性或数值) 持续时间 插值器(可选) 动画开始之后会进行以下步骤: 根据开始时间、当前时间、持续时间算出动画的进度(一般是 0 到 1 之间的一个值)。...

Flutter-4 渲染流程——paint

前文我们分析了 Flutter 渲染流程中的 Build 和 layout,今天我们来看 paint。 mark 阶段 在 _layoutWithoutResize 的最后会调用 markNeedsPaint() 我们从这个方法说起。 RenderObject.markNeedsPaint() void markNeedsPaint() { //如果已经被标记,返回 i...