
在 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 真机 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 已注册」。

(同上:SW 已注册,但 Network 里分片多为页面/系统拉流,Initiator 不见 ServiceWorker)
4)直播 vs 点播:起播要等几个分片
同一套 HLS 封装,直播与点播的起播门槛并不一样。实践里常见现象是:
直播
往往需要先攒够约3 个 .ts 分片(或等价缓冲)才真正开播,否则一直等片。
点播(VOD)
列表侧仍可能规划多个分片,但起播通常在首个分片就绪后就可以开始播放,不必等满 3 个才出画。
怎么标识
直播 / 点播由 playlist 声明区分。点播在 m3u8 中声明 #EXT-X-PLAYLIST-TYPE:VOD(以及完整列表、结束标记等);直播则不走 VOD 语义(持续更新列表)。改错类型,缓冲与 Seek 预期都会偏。

(点播:声明 #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 版本变化;若你侧现象不同,以真机实测为准。产品名仅作描述,不表示附属关系或官方背书。
继续阅读
👇 同标签更多,或返回文章列表