iOS H5 · AVPlayer 接管 HLS 点播示意

iOS H5 HLS 点播:AVPlayer 接管后的 Seek、Service Worker 与起播差异

作者 CaboKit|创建于 |标签 Web技术

在 iPhone Safari / WKWebView 里播 HLS,常见路径不是桌面那套 hls.js + MSE,而是 Hls.isSupported() === false之后把 video.src 指到 .m3u8,由原生 AVPlayer接管拉流、解码与缓冲。桌面 Chrome 测通,不能代表 iOS 验收通过。

本文整理点播场景下几条容易踩坑的观察:非标准分片与 Seek、Service Worker 与系统拉流、直播 / 点播起播差异,以及播放中长黑屏。记录实测差异,方便以后对照。

1)先确认:是不是 AVPlayer 在播

判定

iOS 上多数情况无法走 hls.js;Network 里常见系统级媒体请求,而不是页面里的 xhr/fetch 分片流水线。

后果

缓冲策略、Range 行为、对 MIME / 后缀的容忍度,都以 AVPlayer 为准。页面层「以为自己在控播放」的假设容易失效。

iOS 真机调试:AVPlayer 播放时 DevTools Network 中的 m3u8 与分片请求

(iOS 真机 Web Inspector:AVPlayer 播放期间的 .m3u8 与分片;亦见第 3 节——SW 已注册但请求未必走 SW)

和「CaboKit」另一篇分片外观对照相关时,也请以 iPhone 真机为准——详见 HLS 三方案对照

2)非标准 TS:Seek 极易卡死

标准路径是分片 .ts + Content-Type: video/mp2t,配合合理的 Range / 列表语义。一旦改成非标准包装(例如异常后缀、MIME 不一致,或无视 Range 的整段策略),AVPlayer 仍可能顺序起播,但一拖进度条 / Seek,就很容易进入长时间无响应。

表现

起播尚可 → Seek 后画面停住、控件无反馈,或长时间卡在缓冲;杀进程 / 重进页才恢复。

对照提示

点播验收不要只测「能从头播完」;必须加 Seek / 拖动进度条。非标准分片在 Android hls.js 上「看起来还行」,不能外推到 iOS。

3)经 Service Worker 加载的 TS:AVPlayer 难「加速」

页面脚本里用 Service Worker 缓存、改写、拦截分片请求,对 fetch / 一般资源很常见。但 AVPlayer 拉 HLS 时常走系统媒体通道,并不等价于你在页面里拦到的那条流水线。

真机常见现象

SW 已经 register 成功,Application / 日志里也能看到 worker;但 Network 里分片请求的 Initiator 并不显示走 Service Worker——媒体仍由系统栈拉取,SW 的 fetch 钩子够不到这条通道。

后果

在 SW 里做的缓存命中、预处理或「加速」,对 AVPlayer 分片往往无效;也可能出现页面通道与系统通道并存、策略不一致。

验收建议

在 iOS 真机上分别测:无 SW / 有 SW。看起播耗时、Seek 是否更稳、源站请求是否真少——以系统栈与 Network Initiator 为准,不要只看「SW 已注册」。

iOS 真机 DevTools:AVPlayer 播放中分片请求未显示走 Service Worker

(同上:SW 已注册,但 Network 里分片多为页面/系统拉流,Initiator 不见 ServiceWorker)

4)直播 vs 点播:起播要等几个分片

同一套 HLS 封装,直播与点播的起播门槛并不一样。实践里常见现象是:

直播

往往需要先攒够约3 个 .ts 分片(或等价缓冲)才真正开播,否则一直等片。

点播(VOD)

列表侧仍可能规划多个分片,但起播通常在首个分片就绪后就可以开始播放,不必等满 3 个才出画。

怎么标识

直播 / 点播由 playlist 声明区分。点播在 m3u8 中声明 #EXT-X-PLAYLIST-TYPE:VOD(以及完整列表、结束标记等);直播则不走 VOD 语义(持续更新列表)。改错类型,缓冲与 Seek 预期都会偏。

m3u8 Preview:#EXT-X-PLAYLIST-TYPE:VOD

(点播:声明 #EXT-X-PLAYLIST-TYPE:VOD;起播通常首片就绪即可出画)

m3u8 Preview:无 EXT-X-PLAYLIST-TYPE:VOD 的直播式列表

(直播式:未见 PLAYLIST-TYPE:VOD;起播常需先攒约 3 个分片,TARGETDURATION 等也会影响等待)

起播慢时先核对:当前到底是 VOD 还是 live 语义,再查分片时长与目标缓冲,而不是先怪解码器。

5)播放期间:偏长的黑屏

AVPlayer 接管后,切换码率、跨分片、Seek 落点不齐,或关键缓冲欠账时,可能出现明显偏长的黑屏(画面清空、音频也可能停),体感比桌面 hls.js 更「硬」。

观察

记下黑屏出现在「起播 / Seek / 中途自动切流」哪一段,以及当时 Network 是否在补片。

对照

同一素材在标准 TS 点播与非标准包装下对比;排除业务层盖了一层黑 mask。真机录屏比口头描述更有说服力。

6)验收清单(点播)

路径确认

iPhone 真机确认走 AVPlayer,不要用桌面 Chrome 替代。

Seek

多处拖动进度条;非标准分片重点看是否卡死。

SW

有 / 无 Service Worker 各测一轮,核对是否真加速了系统拉流。

playlist 类型

点播声明 EXT-X-PLAYLIST-TYPE:VOD;起播是否符合「首片可播」预期。

黑屏

记录时长与触发动作;必要时对照标准 TS 源。

📝 补充说明:以上为特定终端与业务组合下的工程观察,会随 iOS / WebKit / AVFoundation 版本变化;若你侧现象不同,以真机实测为准。产品名仅作描述,不表示附属关系或官方背书。

继续阅读

👇 同标签更多,或返回文章列表

全部文章|Web技术

下一篇:HLS 对照实验:TS·200+Range、JPG·206 与 JPG·200