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-AAC、Apple Lossless、FLAC是演讲点名的新音频 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行,提取AUDIO、BANDWIDTH、SCORE,为 USAC 或指定 codec 生成优先级报告。
关联 Session
- What’s new in Low-Latency HLS — 低延迟 HLS 的总览,解释 2020 年低延迟扩展的整体方向。
- Discover HLS Blocking Preload Hints — 深入 preload hints,补足本 Session 中 Delivery Directives Interface 的服务器侧背景。
- Optimize live streams with HLS Playlist Delta Updates — 解释 delta updates,适合继续优化直播 playlist 传输成本。
- Deliver a better HLS audio experience — 深入音频 codec 和音频体验,衔接本 Session 的音频组建议。
- Adapt ad insertion to Low-Latency HLS — 讲低延迟直播广告插入,适合已有低延迟流后继续处理变现链路。
评论
GitHub Issues · utterances