HTTP 视频交付的范围从可搜索的单个文件,到由短媒体分段组成的自适应序列。HTTP 传输表示和验证器;容器组织带时间信息的轨道;编解码器则对音频和视频采样进行编码。将这些层分离,可以更容易地诊断范围处理、缓存和播放失败问题。
渐进式下载 #
浏览器可以通过 <video> 元素播放自包含的媒体文件。浏览器可以从普通的 GET 请求开始,也可以只请求一个字节范围:
GET /media/talk.mp4 HTTP/1.1
Host: media.example
Range: bytes=0-当所选表示支持范围请求时,服务器返回 206 Partial Content、所选区间以及完整表示的长度:
HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: video/mp4
Content-Range: bytes 0-1048575/73400320
Content-Length: 1048576
ETag: "talk-v3"一个可满足的单一范围必须恰好包含 Content-Range 描述的字节。不可满足的范围返回 416 Range Not Satisfiable,并带有 Content-Range: bytes */73400320。忽略 Range 的服务器可以通过 200 OK 返回完整表示,但不得将完整响应体标记为部分响应。
验证器和缓存重新验证 #
范围请求只适用于一个表示版本。发送强 ETag 或 Last-Modified,并允许客户端在恢复下载或搜索时使用 If-Range:
Range: bytes=32243712-32955076
If-Range: "talk-v3"如果验证器仍然匹配,服务器可以返回请求的范围。否则,服务器返回当前的完整表示,从而避免将两个编码版本中的字节合并。普通条件请求使用 If-None-Match 或 If-Modified-Since,并且可能收到 304 Not Modified。根据内容的可变性定义 Cache-Control:基于内容寻址的分段可以是不可变的,而实时内容的清单需要较短的 freshness 时间。
编解码器、容器、文件和流 #
H.264、AV1、AAC 或 Opus 等编解码器会转换采样数据。ISO Base Media File Format 或 WebM 等容器存储一个或多个已编码轨道、时间戳、索引和元数据。一个文件可以包含多个编解码器,同一个编解码器也可以出现在多个容器中。
通过范围请求交付的有限 MP4 文件属于渐进式下载,即使播放在下载完成前就已开始。实时源在采集时是连续的,但 HTTP 交付仍会公开有限资源,例如不断移动的清单和媒体分段。对于渐进式 MP4,应将初始化元数据和索引元数据放在客户端可以先于媒体字节获取的位置,通常通过 fast-start 处理将 moov 元数据移到文件开头附近。
HLS 和 DASH #
HTTP Live Streaming(HLS)使用媒体播放列表和多变体播放列表。MPEG-DASH 使用 Media Presentation Description。两者都描述多个表示版本和可寻址的媒体分段。播放器会估算吞吐量和缓冲区状态,然后选择其编解码器、尺寸、比特率和设备能力符合当前条件的表示版本。
不同表示版本之间的分段边界应保持对齐,从而在切换时维持时间线。较小的分段可以降低实时延迟,但会增加请求、清单和 CDN 的开销。低延迟模式会增加更短的部分分段,并要求源站到播放器之间具有更严格的时间控制;但两种协议都不会消除编码器和播放器的缓冲。
CDN 将清单和分段作为普通 HTTP 资源进行缓存。使用带版本的分段 URL、正确的 Content-Type、验证器和缓存指令。避免使用会无意中拆分缓存键的 Cookie 或查询字符串。实时播放列表必须足够快地过期,以便显示新分段;已完成的视频点播分段则可以使用较长的不可变生命周期。
预加载、可搜索性和延迟 #
HTML 的 preload 属性是一种提示,可取值为 none、metadata 或 auto。用户设置、节省流量策略、自动播放规则和实现决策都可能覆盖该提示。应用程序不得假定 preload="auto" 会下载整个文件。
搜索需要将播放时间映射到可访问的字节或分段。容器索引支持基于范围的文件搜索;HLS 或 DASH 时间线标识对应的分段。实时窗口可能丢弃旧分段,因此超出所公布窗口的搜索必须失败,或移动到最早的可用位置。
启动延迟包括清单或元数据获取、连接建立、初始分段传输、解码以及播放器的安全缓冲区。端到端实时延迟还包括采集、编码、打包、CDN 传播和播放缓冲。应测量每个阶段,而不是将所有延迟都归因于网络带宽。
服务器检查清单 #
- 对渐进式文件一致地支持
HEAD、完整GET、有效的单一或多段字节范围,以及416响应。 - 在节点之间保留表示验证器,并返回准确的
Content-Length、Content-Range和媒体Content-Type值。 - 对每个范围和分段请求进行授权;缓存的部分响应不得绕过完整对象的访问策略。
- 测试接近开头和结尾的搜索、并发范围、过期的
If-Range、CDN 缓存命中、带宽变化,以及实时播放期间的清单刷新。
当单一表示和普通搜索可以满足产品需求时,使用渐进式文件。当客户端需要自适应比特率、实时发布、多种表示版本或面向分段的 CDN 工作流时,使用 HLS 或 DASH。
评论
在 GitHub 上阅读或评论(发表评论需要登录)