这一组覆盖两条自适应流协议(HLS、DASH)、一层版权保护(DRM),以及一个把它们接起来的 Android 播放引擎(ExoPlayer),末尾附一张 HLS 与 DASH 的对比表。
一、HLS:m3u8 清单与分片组织
HLS 把音视频切成 .ts / .m4s 分片,用 m3u8 清单组织。播放器先拉 master playlist,按带宽选 variant,再按序拉 media playlist 里的分片。直播用 EVENT / SLIDING 窗口不断刷新清单,点播用 VOD 完整列表。
EXT-X-KEY 描述 AES 加密,EXT-X-MAP 描述 fMP4 初始化段,EXT-X-DISCONTINUITY 处理接片。CDN 要保证分片时长一致、规避缓存层与清单漂移。低延迟直播会把分片缩到 1–2 秒并配 LL-HLS 的 PART。
排隙时先看 m3u8 是否可访问、相对路径与 CORS,再对比 PTS / DTS 是否连续。与 DASH 相比,HLS 在 Apple 生态更顺,但 ABR 算法与 CMAF 互播要额外设计。
容易踩的坑:
- CDN 分片时长不一致或清单漂移,会卡顿或跳片。
- 低延迟需配 LL-HLS 的
PART,不只缩分片。
什么时候用:兼容优先、点播与常规直播,尤其 Apple 生态。
二、DASH:MPD 与更细粒度的描述
DASH 用 MPD 描述 Period / AdaptationSet / Representation。播放器按带宽切 Representation,按 SegmentTemplate 或 SegmentList 拉分段。与 HLS 的 m3u8 不同,MPD 是 XML,能更细粒度描述音视频角色与多视角。
直播依赖 UTCTiming 与滑动窗口,点播用 static MPD。CMAF 让 DASH 与 HLS 共享同一组 fMP4 分片。加密走 ContentProtection(Widevine / PlayReady),初始化段在 Initialization 段里。
ABR 要结合 buffer 与下载速度切,避免频繁跨 Representation 导致卡顿。调试可把 MPD 拉下来核对 timescale、presentationTimeOffset 与段号连续性。
容易踩的坑:
- ABR 切太激进会反复缓冲,要结合 buffer 与下载速度。
- MPD 的 timescale / offset / 段号连续性错了,seek 与滑窗出问题。
什么时候用:多视角、多角色或更细粒度描述;与 HLS 共用 CMAF 省一套打包。
三、DRM:分发了之后,谁来管使用权
DRM 是数字版权管理,用来控制音视频和文档谁能播、能播多久、能否下载。常见体系有 Widevine、FairPlay 和 PlayReady,以及文档领域的加密许可。流程是内容加密存储,播放时向许可服务器要密钥,设备用安全模块解密。它解决的是分发后的使用权,不是传输加密本身。做点播和直播版权保护时,打包、许可和播放器要同一套方案,换一端就会播不了。
容易踩的坑:
- 许可和密钥不分离:CDN 上是密文,密钥只发给通过鉴权的设备,否则泄露一张卡就等于泄露内容。
- 安全级别不分档:硬件级 TEE 才能播高码率,软件级只能降级,授权策略要按设备能力写。
- 过期与并发不可吊销:换机、退订必须让旧许可失效,否则会出现永久离线可播。
什么时候用:付费影视、教材和商业直播需要 DRM;内部培训视频用简单鉴权即可。选型时先看终端覆盖,再谈打包工具和许可服务部署。
四、ExoPlayer:把协议接起来的 Android 播放引擎
ExoPlayer 是 Android 上可替换的媒体引擎:MediaSource 负责拉流,Renderer 负责解码渲染,LoadControl 管缓冲,TrackSelector 选轨。支持 Progressive、HLS、DASH、RTSP,Media3 后包名迁到 androidx.media3。
播放器要跟生命周期绑定:STARTED 时 play,STOP 时 pause,DESTROY 时 release。后台播放走 MediaSession。字幕、DRM 走 DefaultDrmSessionManager。直播注意 liveOffset 与目标延迟。
卡顿先看 bandwidth meter 与缓冲水位,再查解码器是否走硬件。自定义 DataSource 可接自有 CDN 鉴权。不要在主线程 prepare 超大清单,用 player 的监听回调切 UI。
容易踩的坑:
- 不在生命周期里 release,会泄漏播放器与解码资源。
- 主线程 prepare 超大清单阻塞 UI,须异步并用回调切 UI。
什么时候用:Android 统一接入 HLS / DASH / Progressive / RTSP 并自定义缓冲、选轨、DRM 与 CDN 鉴权;Media3 化注意包名迁移。
附:HLS 与 DASH 对比表
| 维度 | HLS | DASH |
|---|---|---|
| 清单格式 | m3u8(文本) | MPD(XML) |
| 分片 / 段 | .ts / .m4s |
fMP4(SegmentTemplate / SegmentList) |
| 加密描述 | EXT-X-KEY(AES) |
ContentProtection(Widevine / PlayReady) |
| 直播机制 | EVENT / SLIDING 窗口 + LL-HLS PART |
UTCTiming + 滑动窗口(static 用于点播) |
| 多视角 / 角色 | 相对较弱 | 更细粒度(AdaptationSet / Representation) |
| 生态与互播 | Apple 生态更顺,CMAF 互播需额外设计 | CMAF 可与 HLS 共享同一组分片 |
| 调试切入点 | m3u8 可访问性 / CORS / PTS-DTS 连续性 | 拉 MPD 核对 timescale / offset / 段号连续性 |
流媒体协议与播放器:从分片清单到 Android 引擎
https://lautung.com/archives/streaming-protocols
评论