7.4.3 分片机制与直播滑动窗(Segments & The Sliding Window)

上一节结尾放了句狠话:TARGETDURATION 写错了会卡顿,MEDIA-SEQUENCE 错位了会丢片。这不是危言耸听,而是 RFC 8216 用 MUST 与 SHOULD 逐字钉死的语义。本节把这些标签拆开,顺带回答另一个问题:分片文件本身是什么格式——TS 与 fMP4 两种载体,恰好都是 7.1 的老熟人。

TARGETDURATION:全列表的天花板

规范的措辞毫不含糊:EXT-X-TARGETDURATION 声明 整份列表的最大分片时长,每个分片的 EXTINF 四舍五入到整数后 MUST 不超过它;超长的分片 "can trigger playback stalls or other errors"——会实打实地卡住播放 [8]。它是必填标签,作用于整份列表。

为什么上限如此要紧?播放器按 TARGETDURATION 预估缓冲水位与下载节奏,一片超时,全部算盘落空。服务器侧的义务同样写死:源媒体 必须 被切成不超过恒定目标时长的分片,且 应当 在包边界与关键帧边界下刀 [8]——第六章讲 GOP 时建立的图景在此复现:分片边界对齐关键帧,每片才能独立解码、随时起播。

MEDIA-SEQUENCE 与滑动窗:只许追加的账本

EXT-X-MEDIA-SEQUENCE 标注 列表中第一个分片的序号,缺省视为 0,且必须出现在首个分片之前 [8]。它的存在感在直播场景才彻底爆发。规范给直播服务器划了一份 "白名单"——除了四种操作,不许对媒体列表做任何改动 [8]

  • 向列表 追加 行(新分片入窗)
  • 按出现顺序移除 分片 URI 及其专属标签(旧分片出窗)
  • 递增 MEDIA-SEQUENCE / DISCONTINUITY-SEQUENCE 的值
  • 添加 EXT-X-ENDLIST(宣告终结)

四句话勾勒出的,正是滑动窗口的完整生命周期:尾部追加、头部移除、序号递增,列表在客户端眼里像一卷只许向前滚动的胶片。规范还要求所有改动 原子生效——客户端绝不允许读到改了一半的列表 [8]

另外两个语义要点:其一,EXT-X-ENDLIST 出现即宣告不再追加分片,点播列表必有,直播列表绝不可现身;其二,EXT-X-PLAYLIST-TYPE 把列表分为 VOD(内容固定)与 EVENT(只增不减的事件流,窗口不滑动)两类 [8]。还有一个客户端侧的陷阱:不同媒体列表里序号相同的两个分片,不得 假设内容一致 [8]——序号只是序号,不是内容指纹。

TS 分片:自带入场券的老兵

经典 HLS 分片用 MPEG-TS——7.1.4 讲过的那位定长包老兵。规范的要求是:每个 TS 分片 MUST 携带 PAT 与 PMT(或改用 EXT-X-MAP 声明初始化段);不带 MAP 的分片,头两个 TS 包 SHOULD 就是 PAT 和 PMT [8]

这条规则的用意,7.1.4 已经预演过:PAT/PMT 高频重复,保证 任意分片、任意位置切入都能立即认出流结构。观众拖动进度条、ABR 切换档位,播放器拿到的每一片都自带入场券——TS 的容错设计从广电时代一路服务到 HTTP 时代,与 CDN 的分片缓存模型严丝合缝。

fMP4 分片:EXT-X-MAP 与初始化段

TS 并非唯一选择。2017 年定格的 RFC 8216 已把 fragmented MP4 写为正式分片载体;此后 CMAF 兴起,更为它添了一把火。fMP4 分片把 7.1.2 的 Box 知识拆成两截:初始化段(ftyp + moov,描述轨道与编码参数)与 媒体分片(moof + mdat,装着实际的片段数据)。规范的处理干净利落 [8]

  • 每个 fMP4 分片 MUST 有 EXT-X-MAP 标签,URI 指向初始化段——上一节实测列表里那行 #EXT-X-MAP:URI="..._init.mp4",职责即在于此
  • 一个 MAP 对其后所有分片生效,直到下一个 MAP 出现;BYTERANGE 属性可选,允许初始化段与媒体数据同居一个文件的不同字节区间
  • fMP4 分片 必须 使用电影片段相对寻址(tfdt 记录解码时间),不得 引用外部数据——CMAF Segment 天然满足这些约束

初始化段只下载一次、媒体分片轻装上阵,7.1.2 说过的 "索引与数据分家" 思想,在流式场景换了一副面孔重演。而 CMAF 这个名字先留个记号——7.5 讲 DASH 时,我们会看到它如何统一两大自适应流阵营的分片格式。

小结

标签语义与分片载体都已就位:TARGETDURATION 封顶、MEDIA-SEQUENCE 滚动、ENDLIST 终局,TS 自带入场券、fMP4 靠 MAP 分家。列表与分片都备齐了,剩下最灵动的一环——多档变体流之间,客户端凭什么决定此刻该看哪一档?下一节,自适应码率的切换艺术。

Copyright © Since 2021 李述博 (Arikan.Li) , All Rights Reserved all right reserved,powered by GitbookLast Updated: 2026-08-26 08:25:15

results matching ""

    No results matching ""