WWDC Quick Look 💓 By SwiftGGTeam
Improve stream authoring with HLS Tools

Improve stream authoring with HLS Tools

观看原视频

Highlight

Apple 将 Low-Latency HLS 工具合并回 HLS Tools,Media Stream Validator 增加即时错误报告,Media Stream Segmenter 能生成 partial segments,并用 SCORE 属性帮助开发者控制主播放列表中的变体选择。


核心内容

做 HLS 流,难点常常不在播放器端。真正耗时间的是制作链路:输入怎么切片、直播 playlist 怎么持续更新、低延迟请求怎么返回、主播放列表里一堆音频组和视频变体怎么组合。一个细节错了,线上用户看到的是启动慢、切换乱、音质不符合预期,开发者却要回到工具输出和 playlist 标签里一点点排查。

2020 年,Apple 把前一年单独发布的 Low-Latency HLS Tools 收回到统一的 HLS Tools 发行包。这样,低延迟流的生成、验证和报告不再是一套旁支工具。Media Stream Validator 也有了 immediate option,直播验证不必等半小时或一小时结束后才看到大部分错误。

这场 Session 的主线很清楚:先把低延迟测试流跑起来,再把音频 codec 和主播放列表处理好。TS Recompressor 负责生成测试输入,Media Stream Segmenter 负责切 partial segments,Delivery Directives Interface 脚本负责处理低延迟 HLS 需要的查询参数。最后,主播放列表用音频组、CODECS 属性和 SCORE 属性告诉播放器该优先选择哪条变体。


详细内容

HLS Tools 的 2020 更新

00:49)Apple 首先说明工具分发方式的变化:Low-Latency HLS 走出 beta 后,低延迟相关工具回到单一 HLS Tools 包。验证环节也变了。Media Stream Validator 新增 immediate option,检测到错误时立即报告,适合长时间运行的直播验证。

# 2020 年工具链中需要重点检查的三件事
Media Stream Validator: immediate option
HLS Report: compiled binary
HLS Tools: single tool distribution with Low-Latency HLS tools

关键点:

  • Media Stream Validator 用来验证 HLS 流。演讲中明确说,新的 immediate option 会在发现错误时立即报告。
  • HLS Report 从 Python script 改成 compiled binary,旧的 deprecated option 被移除,其余功能保留。
  • single tool distribution 表示低延迟工具不再放在单独包里,低延迟制作链路回到常规 HLS Tools 工作流。

用工具生成 Low-Latency HLS 测试流

02:41)低延迟测试流的流程由三段组成。TS Recompressor 生成 transport stream,经 UDP 发给多个 Media Stream Segmenter。每个 segmenter 输出 media playlist 和 media segments。由于直播 playlist 会持续更新,服务器还要用 Delivery Directives Interface 脚本解释查询参数,并返回修改后的 playlist。

TS Recompressor
  -> UDP transport stream for preview at 500 Kbps
  -> UDP transport stream for lower-quality video at 2 Mbps
  -> UDP transport stream for main output at 4 Mbps

Media Stream Segmenter for each output port
  -> media playlist
  -> media segments

Delivery Directives Interface script
  -> synthesized playlist with EXT-X-RENDITION-REPORT

关键点:

  • TS Recompressor 在这场演讲中用于生成视频和音频测试输入,并把三路输出发到不同 UDP port。
  • Media Stream Segmenter 每个输出端口需要一份实例,分别处理对应码率的输入。
  • Delivery Directives Interface script 负责低延迟 HLS 的查询参数处理,返回指向同一批 media segments 的修改版 playlist。
  • EXT-X-RENDITION-REPORT 让某个变体的 playlist 能带上其他变体的信息,脚本要求所有变体写到同一个父目录下的子目录,便于相对查找。

Segmenter 生成 partial segments

04:18)Media Stream Segmenter 为 Low-Latency HLS 增加了 partial segments 和相关标签。演讲点名了几个关键选项:part-target-duration-ms 激活 partial segment 生成,date-time 会向 playlist 添加 EXT-X-PROGRAM-DATE-TIME 标签。

Media Stream Segmenter options described in the session:
  part-target-duration-ms   # activates generation of partial segments
  target duration           # parent segment duration
  playlist parent segments  # how many parent segments stay in the playlist
  delete segments           # remove segments after they are no longer needed
  date-time                 # adds EXT-X-PROGRAM-DATE-TIME

关键点:

  • part-target-duration-ms 是低延迟切片的开关,segmenter 会生成 partial segments。
  • target duration 仍然控制 parent segment 的目标时长。
  • playlist parent segments 控制 live playlist 中保留多少个 parent segments。
  • delete segments 清理过期 segment,符合直播 playlist 动态增加和删除 segment 的特性。
  • date-time 会写入 EXT-X-PROGRAM-DATE-TIME,让 playlist 带有节目时间信息。

为新音频 codec 组织音频组

05:38)主播放列表最容易变复杂的地方是音频。演讲提到 2020 年工具新增了音频 codec 支持,包括 USAC 或 xHE-AAC、Apple Lossless、FLAC。构建 master playlist 时,先选视频分辨率和 codec,再列出语言、音频 codec、声道数。每个 codec 和声道数组合应建立一个 audio group,并且每个 group 都要包含所有语言。

Master playlist audio workflow:
  1. choose video resolutions and video codecs
  2. list audio languages, such as English and Chinese
  3. list audio codec families, such as AAC, FLAC, AC-3, USAC/xHE-AAC, and Apple Lossless
  4. create one audio group for each codec and channel-count pair
  5. put every language in every audio group
  6. replicate variant entries for the audio groups

关键点:

  • USAC / xHE-AACApple LosslessFLAC 是演讲点名的新音频 codec 方向。
  • 每个 audio group 必须包含每种语言。比如英文和中文都存在时,AAC 组、FLAC 组、AC-3 组都要各自包含完整语言集合。
  • stereo AAC group 应该始终存在,因为所有设备都能播放,适合作为 fallback。
  • 如果提供多声道 lossless audio codec,Apple 建议同时提供多声道 AAC codec,避免因为 lossless 码率太高而丢失多声道选择。
  • AAC-LC、HE-AAC、HE-AACv2、USAC / xHE-AAC 之间可以切换;lossless codec 和 AAC codec 之间也可以切换。

用 SCORE 控制变体优先级

08:18)默认选择逻辑会在当前可播放集合里选最高 bit rate。USAC 和 Dolby Digital Plus 可能造成开发者不想要的选择顺序。Apple 为 variants 和 I-Frame variants 增加了 SCORE 属性。播放器完成常规过滤后,用最高 SCORE 决定最终选择。

Variant selection with SCORE:
  1. player filters the master playlist to variants that can be played
  2. every variant and I-Frame variant must have SCORE if you want an ordered result
  3. the playable variant with the highest SCORE wins
  4. give USAC variants higher scores than matching HE-AAC variants when USAC should be preferred

关键点:

  • SCORE 的值是浮点数,演讲明确要求如果要设置顺序,就要在所有 variants 上都放这个属性。
  • 播放器先按常规规则过滤到可播放集合,再用最高 SCORE 选择。
  • 给 USAC variants 更高分,可以让支持 USAC 的设备优先选择 USAC;不支持 USAC 的设备仍会落到 HE-AAC。
  • 这个属性适合解决“带宽排序正确,但业务希望优先音频 codec”的 master playlist 问题。

核心启发

  • 做一个低延迟 HLS 本地试播台

    • 做什么:用 TS Recompressor 生成三路测试输入,再用多个 Media Stream Segmenter 输出低延迟 media playlists。
    • 为什么值得做:Session 给出了 preview、2 Mbps、4 Mbps 三路变体的工作流,适合在上线前复现低延迟链路。
    • 怎么开始:先准备同一父目录下的多个变体子目录,再让每个 UDP 输出端口对应一个 segmenter,并开启 part-target-duration-ms
  • 做一个直播验证报警脚本

    • 做什么:把 Media Stream Validator 的 immediate option 接入 CI 或直播发布流程。
    • 为什么值得做:长时间直播验证中,错误可以在检测到时输出,团队不用等整段验证结束。
    • 怎么开始:把 validator 输出收集到日志系统,对 playlist、segment、codec 相关错误设置告警规则。
  • 做一个 master playlist 音频组生成器

    • 做什么:输入语言、codec、声道数,自动生成完整 audio groups 和 variant entries。
    • 为什么值得做:演讲强调每个 codec/channel count pair 都要有 audio group,每个 group 都要包含全部语言。
    • 怎么开始:先固定一个 stereo AAC fallback 组,再为 lossless、多声道 AAC、AC-3 等组合扩展 group,最后复制 variant entries。
  • 做一个 SCORE 策略检查器

    • 做什么:扫描 master playlist,检查所有 variants 是否都设置了 SCORE,并验证目标 codec 的分数是否更高。
    • 为什么值得做:Apple 要求排序必须完整;缺少 SCORE 可能让播放器无法按开发者预期选择。
    • 怎么开始:解析 #EXT-X-STREAM-INF 行,提取 AUDIOBANDWIDTHSCORE,为 USAC 或指定 codec 生成优先级报告。

关联 Session

评论

GitHub Issues · utterances