M3U8常见错误及解决方案

遇到M3U8播放问题?这里有详细的故障排除指南

CORS(跨域)错误

错误信息

Access to XMLHttpRequest at 'https://example.com/video.m3u8' 
from origin 'https://yoursite.com' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

🔧 解决方案

1. 服务器端配置CORS头

在服务器响应中添加 Access-Control-Allow-Origin: *

2. 使用代理服务器

通过后端代理请求M3U8文件,避免浏览器CORS限制

3. 使用同源资源

将M3U8文件和网页部署在同一域名下

404 文件未找到

错误信息

GET https://example.com/segment-1.ts 404 (Not Found)
Failed to fetch segment #1 of "https://example.com/playlist.m3u8"

🔧 解决方案

1. 检查URL路径

确认M3U8文件中的TS片段路径是否正确(相对路径/绝对路径)

2. 验证文件存在

直接访问TS文件URL,确认文件确实存在于服务器上

3. 检查基础URL

如果使用相对路径,确保基础URL设置正确

解码/播放错误

错误信息

MEDIA_ERR_DECODE: The media resource indicated by the src attribute 
or assigned media provider object was not suitable.
DOMException: Failed to decode media resource

🔧 解决方案

1. 检查编码格式

确保视频编码为H.264,音频编码为AAC(浏览器标准支持)

2. 验证M3U8格式

确认M3U8文件格式正确,包含必要的标签(#EXTM3U, #EXTINF等)

3. 使用兼容播放器

尝试使用HLS.js等专业播放器库,提供更好的兼容性

网络超时/连接错误

错误信息

NetworkError: Failed to fetch
ERR_CONNECTION_TIMED_OUT
Manifest request timed out

🔧 解决方案

1. 增加超时时间

调整播放器的超时设置,给慢速网络更多时间

2. 使用CDN加速

将视频文件部署到CDN,提高全球访问速度

3. 实现重试机制

添加自动重试逻辑,处理临时网络问题

加密内容错误

错误信息

KEY_LOAD_ERROR: Failed to load decryption key
KEY_SESSION_ERROR: Failed to generate license request
DECRYPT_ERROR: Failed to decrypt segment

🔧 解决方案

1. 验证密钥URL

确保#EXT-X-KEY标签中的URI可访问,且返回正确的密钥

2. 检查密钥格式

AES-128密钥应为16字节,确保密钥格式正确

3. 配置CORS策略

密钥服务器需要正确配置CORS,允许跨域请求

🛠️ 调试工具推荐

浏览器开发者工具

F12打开控制台,查看Network标签监控请求,Console查看错误信息

HLS.js Demo

使用官方demo页面测试M3U8链接,快速验证文件是否有效

FFmpeg/FFprobe

命令行工具检查视频编码、格式是否符合标准

在线M3U8验证器

使用在线工具验证M3U8文件格式是否符合HLS规范

💻 常用调试命令

检查视频编码信息

ffprobe -v quiet -print_format json -show_streams video.m3u8

测试M3U8链接可访问性

curl -I https://example.com/video.m3u8

下载并合并M3U8

ffmpeg -i "https://example.com/video.m3u8" -c copy output.mp4