音视频 / 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。