WWDC Quick Look 💓 By SwiftGGTeam
用 HLS Content Steering 提升全球流媒体可用性

用 HLS Content Steering 提升全球流媒体可用性

观看原视频

用 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-URIsteering 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"]
}
字段作用
VERSIONmanifest 格式版本
TTL客户端下次请求前等待的秒数
RELOAD-URI下次请求的 URI,可注入客户端状态或会话数据
PATHWAY-PRIORITY路径优先级列表,第一个为最高优先级

steering server 可以为每个客户端定制 manifest,实现精细化的流量调度。

客户端行为

加载带 Content Steering 标签的 master playlist 后,客户端执行以下流程(06:56):

  1. 初始选择:仅从初始路径(PATHWAY-ID 指定的路径)的变体流中选择
  2. 启动播放:加载选中的变体流和媒体段
  3. 后台拉取:并行向 steering server 发送 Steering Manifest 请求
  4. 评估切换:收到 manifest 后,排除因网络错误被惩罚的变体流和不受支持的编解码器,选择优先级最高且至少有一个合格变体流的路径
  5. 路径切换:如果选中的路径与当前路径不同,立即切换
  6. 定时重试:按 TTL 调度下一次请求

网络拥塞场景

假设中国 CDN 因用户激增而过载(01:38):

  1. 所有中国用户初始收到 CN 优先级最高的 manifest
  2. steering server 检测到 CN CDN 负载过高
  3. 向 30% 的中国用户发送 JP 优先级最高的新 manifest
  4. 这些客户端评估后切换到 JP 路径,流量重定向到日本 CDN
  5. 中国 CDN 的负载得到缓解

故障恢复场景

假设日本到日本 CDN 的网络路径发生区域性中断(02:54):

  1. 故障前,日本用户定期从 steering server 获取优先级列表 [JP, SG, CN]
  2. 网络中断后,日本 CDN 被标记为惩罚状态
  3. 客户端排除 JP 路径的变体流,选择下一个优先级最高的 SG 路径
  4. 流量自动切换到新加坡 CDN,用户无感知继续观看

TTL 与负载分布

TTL 控制客户端拉取频率(09:42)。steering server 可以:

  • 在拥塞或故障时缩短 TTL,让客户端更快获取新策略
  • 为不同客户端注入随机 TTL 偏移,分散 steering server 的负载
  • 通过 RELOAD-URI 在 URL 中携带会话状态,实现有状态的调度决策

核心启发

  1. 用 PATHWAY-ID 分组 CDN:每个路径对应一个 CDN,变体流按路径分组。初始路径指定播放启动时的 CDN,后续通过 steering manifest 动态调整。

  2. steering server 实现精细化调度:可以根据用户地理位置、CDN 实时负载、网络状况等维度为每个客户端生成定制的优先级列表。

  3. TTL 动态调整应对不同场景:正常运行时 TTL 设为 300 秒,CDN 降级或故障时缩短到 30-60 秒,让客户端更快响应策略变化。

  4. RELOAD-URI 传递会话状态:在 URL 中携带 session ID、用户区域等信息,steering server 基于这些状态做出更精准的调度决策。

  5. 向后兼容现有客户端:不带 Content Steering 支持的旧客户端会忽略 EXT-X-CONTENT-STEERING 标签,将所有变体流视为平等选项,行为与之前一致。

关联 Session

评论

GitHub Issues · utterances