用 HLS Content Steering 提升全球流媒体可用性
Highlight
HLS Content Steering 通过 steering server 与播放器建立旁路通道,内容提供商可以实时更新 CDN 优先级策略。中国 CDN 过载时,steering server 可指示 30% 的现有客户端切换到日本 CDN,无需重新生成 playlist。
核心内容
全球流媒体分发面临两个核心可用性挑战:网络拥塞缓解和故障恢复。传统方案中,CDN 优先级在 master playlist 中硬编码,一旦发布就无法更改。当某个 CDN 过载或故障时,现有客户端会持续向其发送请求,内容提供商束手无策。
HLS Content Steering 通过在 master playlist 中嵌入 steering server 地址,让播放器定期拉取 CDN 优先级更新。内容提供商可以实时调整流量分配、执行负载均衡、响应网络故障——所有决策都在服务端完成,客户端只需遵循 steering manifest 中的优先级列表。
详细内容
传统方案的局限
master playlist 中列出多个 CDN 的变体流(04:45):
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,...
https://cdn-cn.example.com/video/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,...
https://cdn-cn.example.com/video/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1280000,...
https://cdn-jp.example.com/video/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,...
https://cdn-jp.example.com/video/mid.m3u8
这种方案的 playlist 优先级是固定的。内容提供商无法在播放期间更改 CDN 排序,现有客户端也无法被引导到不同的 CDN。
启用 Content Steering
在 master playlist 中添加 EXT-X-CONTENT-STEERING 标签(05:03):
#EXTM3U
#EXT-X-CONTENT-STEERING:SERVER-URI="/steering?video=abc",PATHWAY-ID="CN"
#EXT-X-STREAM-INF:BANDWIDTH=1280000,PATHWAY-ID="CN"
https://cdn-cn.example.com/video/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,PATHWAY-ID="CN"
https://cdn-cn.example.com/video/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1280000,PATHWAY-ID="JP"
https://cdn-jp.example.com/video/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,PATHWAY-ID="JP"
https://cdn-jp.example.com/video/mid.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1280000,PATHWAY-ID="SG"
https://cdn-sg.example.com/video/low.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2560000,PATHWAY-ID="SG"
https://cdn-sg.example.com/video/mid.m3u8
关键属性:
| 属性 | 作用 |
|---|---|
SERVER-URI | steering server 的地址,客户端从此 URI 定期拉取更新 |
PATHWAY-ID | 定义变体流所属的路径,每个路径通常对应一个 CDN |
PATHWAY-ID(标签上) | 指定播放启动时的初始路径 |
变体流通过 PATHWAY-ID 分组。客户端选择某个路径后,只从该路径的变体流中进行码率选择。
带媒体组的 playlist
如果 playlist 包含媒体组(如多音轨),为每个路径复制媒体组并分配唯一 GROUP-ID(06:28):
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="CN-audio",NAME="English",URI="..."
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="JP-audio",NAME="English",URI="..."
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="SG-audio",NAME="English",URI="..."
#EXT-X-STREAM-INF:BANDWIDTH=1280000,PATHWAY-ID="CN",AUDIO="CN-audio"
https://cdn-cn.example.com/video/low.m3u8
Steering Manifest 格式
steering server 返回 JSON 格式的 Steering Manifest(07:53):
{
"VERSION": 1,
"TTL": 300,
"RELOAD-URI": "/steering?video=abc&session=xyz",
"PATHWAY-PRIORITY": ["CN", "JP", "SG"]
}
| 字段 | 作用 |
|---|---|
VERSION | manifest 格式版本 |
TTL | 客户端下次请求前等待的秒数 |
RELOAD-URI | 下次请求的 URI,可注入客户端状态或会话数据 |
PATHWAY-PRIORITY | 路径优先级列表,第一个为最高优先级 |
steering server 可以为每个客户端定制 manifest,实现精细化的流量调度。
客户端行为
加载带 Content Steering 标签的 master playlist 后,客户端执行以下流程(06:56):
- 初始选择:仅从初始路径(
PATHWAY-ID指定的路径)的变体流中选择 - 启动播放:加载选中的变体流和媒体段
- 后台拉取:并行向 steering server 发送 Steering Manifest 请求
- 评估切换:收到 manifest 后,排除因网络错误被惩罚的变体流和不受支持的编解码器,选择优先级最高且至少有一个合格变体流的路径
- 路径切换:如果选中的路径与当前路径不同,立即切换
- 定时重试:按 TTL 调度下一次请求
网络拥塞场景
假设中国 CDN 因用户激增而过载(01:38):
- 所有中国用户初始收到 CN 优先级最高的 manifest
- steering server 检测到 CN CDN 负载过高
- 向 30% 的中国用户发送 JP 优先级最高的新 manifest
- 这些客户端评估后切换到 JP 路径,流量重定向到日本 CDN
- 中国 CDN 的负载得到缓解
故障恢复场景
假设日本到日本 CDN 的网络路径发生区域性中断(02:54):
- 故障前,日本用户定期从 steering server 获取优先级列表
[JP, SG, CN] - 网络中断后,日本 CDN 被标记为惩罚状态
- 客户端排除 JP 路径的变体流,选择下一个优先级最高的 SG 路径
- 流量自动切换到新加坡 CDN,用户无感知继续观看
TTL 与负载分布
TTL 控制客户端拉取频率(09:42)。steering server 可以:
- 在拥塞或故障时缩短 TTL,让客户端更快获取新策略
- 为不同客户端注入随机 TTL 偏移,分散 steering server 的负载
- 通过
RELOAD-URI在 URL 中携带会话状态,实现有状态的调度决策
核心启发
-
用 PATHWAY-ID 分组 CDN:每个路径对应一个 CDN,变体流按路径分组。初始路径指定播放启动时的 CDN,后续通过 steering manifest 动态调整。
-
steering server 实现精细化调度:可以根据用户地理位置、CDN 实时负载、网络状况等维度为每个客户端生成定制的优先级列表。
-
TTL 动态调整应对不同场景:正常运行时 TTL 设为 300 秒,CDN 降级或故障时缩短到 30-60 秒,让客户端更快响应策略变化。
-
RELOAD-URI 传递会话状态:在 URL 中携带 session ID、用户区域等信息,steering server 基于这些状态做出更精准的调度决策。
-
向后兼容现有客户端:不带 Content Steering 支持的旧客户端会忽略
EXT-X-CONTENT-STEERING标签,将所有变体流视为平等选项,行为与之前一致。
关联 Session
- WWDC2021 10140 - HLS 动态广告插播探索 — HLS Interstitials 与 Content Steering 的协同
- WWDC2021 10187 - 使用 Group Activities 构建自定义体验 — SharePlay 中的流媒体分发
- WWDC2021 10225 - 使用 Group Activities 协调媒体体验 — 多人同步播放的 CDN 选择
- WWDC2021 10189 - Safari 中的 Group Activities — Web 端流媒体与 CDN 调度
评论
GitHub Issues · utterances