如何识别CORS故障
| 查看 | 症状 | 意义 |
|---|---|---|
| 清单被阻止 | .m3u8 请求在播放开始前失败。 | 来源需要Access-Control-Allow-Origin或者玩家需要代理。 |
| 钥匙被锁 | 清单已加载,但加密播放失败。 | AES-128 密钥 URL 还必须允许 CORS 或通过同一代理进行路由。 |
| 段被阻止 | 播放开始,然后缓冲或停止。 | 每个 .ts 或 .m4s 段请求都需要相同的 CORS 路径。 |
| VLC 有效,浏览器失败 | 桌面播放可以,但网页播放不行。 | 这通常可以确认浏览器CORS问题,而不是流损坏。 |
| 预检失败 | 自定义标头会触发源拒绝的 OPTIONS 请求。 | 避免不必要的标头或配置代理/源来处理选项。 |
如何修复或测试 HLS CORS 错误
- 1
检查清单是否加载
打开M3U8URL或将其粘贴到播放器中。如果清单请求被CORS阻止,则播放甚至无法开始。
- 2
与VLC比较
如果VLC可以播放相同的URL但浏览器不能,则流可能是可达的并且故障在于浏览器访问控制。
- 3
启用智能CORS代理
打开代理,以便清单、加密密钥和媒体片段都通过浏览器可以读取的响应进行传输。
- 4
运行健康报告
通过代理使用验证器来检查段是否确实有效,而不是仅仅被 CORS 阻止。
- 5
仅在需要时添加Referer
如果源端使用热链接保护,请将原始页面URL设置为Referer。除非源需要,否则不要添加自定义标头。
为什么 HLS 在多个 URL 上需要 CORS
HLS 播放器不会只获取一个文件。它获取主清单、一个或多个媒体播放列表、AES-128流的加密密钥以及许多分段URL。这些资源中任何一个缺少 CORS 标头都可能会中断播放,因此仅测试第一个 .m3u8 响应是不够的。
Access-Control-Allow-Origin 应该做什么
对于公共流,源可以为托管播放器的站点发送Access-Control-Allow-Origin,或者在不涉及凭据时使用通配符。对于私有流,请保持源锁定并使用受控代理端点进行测试。避免在同一个 HLS 会话中混合直接和代理URL。
为什么代理对于调试很有用
代理允许浏览器从您自己允许的来源请求HLS资产,同时代理获取真实的清单、密钥和分段URLs。这使得可以判断流是否被破坏或仅仅是被浏览器策略阻止。当来源需要时,它还为您提供了一个添加 Referer 或 User-Agent 的位置。
相关流调试工具
- M3U8 链接故障排除 涵盖 CORS、Referer、死段、编解码器限制和 DRM。
- 自定义RefererM3U8播放器 解释了需要转发标头的受热链接保护的流。
常见问题
是什么导致了 HLS CORS 错误?
当浏览器因源不允许跨源访问而无法读取 M3U8 清单、加密密钥或媒体段时,会发生 HLS CORS 错误。 VLC 仍然可以播放流,因为CORS 是由浏览器强制执行的。
为什么我的 M3U8 流可以在 VLC 中播放,但不能在 Chrome 中播放?
VLC 不受浏览器CORS 检查的限制。如果 VLC 有效并且 Chrome 失败,则通常可以访问该流,但浏览器无法在没有 CORS 标头或代理的情况下读取一个或多个 HLS 请求。
CORS 代理可以修复 M3U8 播放吗?
是的,用于测试和调试。代理必须路由清单、媒体播放列表、密钥和片段,以便每个 HLS 请求都来自允许浏览器读取的源。
HLS 段需要 CORS 标头吗?
是的。清单、子播放列表、密钥和每个媒体片段都需要能够被浏览器读取。即使顶级 .m3u8 文件具有正确的 CORS 标头,流也可能会失败。
这和盗链保护一样吗?
不是。CORS 是浏览器访问规则。盗链保护是一项起源规则,可能需要特定的 Referer 或 User-Agent。有些流同时存在这两个问题,因此您可能需要一个代理和一个匹配的Referer。