Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

音视频 / Media3 / ExoPlayer

音视频不是所有 Android 岗都深考,但一旦岗位涉及播放器、短视频、直播,Media3/ExoPlayer、首帧、卡顿和缓存就是硬门槛。

一、音视频基础概念

概念含义
容器MP4、MKV、FLV,负责封装音视频轨道
编码H.264/H.265/AAC,负责压缩
解码将压缩数据还原为可播放帧
帧率/码率影响流畅度、清晰度、带宽
PTS/DTS播放时间戳/解码时间戳

二、Android 播放链路

数据源 → demux 解封装 → audio/video decoder → audio track / surface 渲染 → 同步播放。

三、Media3 / ExoPlayer 核心组件

组件职责
Player播放控制 API
MediaItem媒体描述
MediaSource数据源与 timeline
Renderer音频/视频渲染
LoadControl缓冲策略
DataSource网络/文件读取

四、首帧、卡顿与缓冲优化

  • 首帧:DNS/TCP/TLS、manifest、首包、解码器初始化都会影响。
  • 卡顿:网络波动、缓冲不足、解码耗时、渲染阻塞。
  • 优化:预加载、合适 buffer、缓存、降码率、错误重试。

五、缓存与离线播放

缓存要考虑 key、清理策略、空间上限、版权/加密、断点续传。不要把短视频缓存策略简单套到长视频。

六、常见业务场景

  • Feed 自动播放:静音、预加载、滑出暂停、资源释放。
  • 直播:低延迟优先,容忍少量画质波动。
  • 长视频:稳定和清晰度优先,可接受较大缓冲。

高频面试题

Q1:首帧慢怎么排查? 答:拆链路看网络建连、首包、manifest、缓存命中、解码器初始化、surface ready,用埋点分段定位。

Q2:Media3 和 ExoPlayer 什么关系? 答:Media3 是 Jetpack 媒体库集合,ExoPlayer 已迁移到 Media3 命名空间,核心思想仍是 Player/MediaSource/Renderer 等组件。

Q3:Feed 视频怎么避免滑动卡顿? 答:控制同时播放数量、提前 prepare、复用 player 或控制 player 池、滑出及时释放 surface/解码资源,不要在 bind 阶段做重初始化。

易错点 / 追问

  • 不要混淆容器格式和编码格式。
  • 不要只说“加缓存“,要说明缓存 key、大小和清理策略。
  • 低延迟和稳定性通常是 tradeoff。