Roku播放器播放Akamai CDN HLS直播流报invalid or corrupt playlist错误
问题背景
OTT应用采用Akamai CDN分发HLS流,配置了直播、VOD两类流访问地址。其中VOD内容可在Roku播放器上流畅播放,但播放部分直播流时,Roku播放器抛出如下错误:
reader pick stream error:bad:invalid or corrupt playlist
同一直播流在Apple TV、VLC、Exo Player、Android TV及Web端播放器(JWplayer、HTML5)上均可正常播放,另有少部分直播流也可在Roku播放器上正常运行。目前已耗时4周排查未定位根因。
已完成排查项
- 校验API调用逻辑与端点配置
- 校验播放器侧URL拼接规则
- 校验Cookie配置与传递逻辑
- 校验HTTP 1.0/1.1/2.0协议适配情况
- 校验25000kbps以上码率配置
- 校验视频编码格式匹配性
- 流存在分辨率差异,但同分辨率规格的VOD内容可正常播放
针对性排查解决思路
Roku对HLS规范的校验严格度远高于其他主流播放器,绝大多数其他端可正常播放、Roku报播放列表损坏的问题,都源于m3u8文件的格式合规性细节问题,按以下优先级排查:
- 直接通过
curl/wget拉取出问题直播流的主m3u8、各级子m3u8原始文件,和可正常播放的直播流、VOD流m3u8逐行对比,不要依赖播放器内置调试工具的转码后内容- 确认m3u8第一行严格为
#EXTM3U,文件开头不能存在BOM头、空行、多余空格、前置注释内容,这类问题其他播放器会自动容错跳过,Roku会直接判定文件损坏 - 逐行检查是否存在多余空行,尤其是分片URL行、标签行前后的无意义空行,Roku解析到空行会直接中断
- 检查所有标签的语法合规性:
#EXT-X-VERSION版本号必须和文件内使用的特性匹配,例如使用#EXT-X-MAP标签时版本号不能低于6,使用#EXT-X-DATERANGE时版本号不能低于3;#EXT-X-TARGETDURATION值必须大于等于所有分片#EXTINF的时长取整值,直播流出现分片时长溢出该值时,Roku会直接判定列表无效;#EXT-X-MEDIA-SEQUENCE序号必须连续,不能出现跳号、回退 - 检查分片URL格式:如果是相对路径需确认路径层级正确,如果是绝对路径需确认所有特殊字符(空格、&、中文等)都做了URL编码,Roku不会自动处理未转义的特殊字符
- 检查
#EXT-X-KEY、#EXT-X-MAP、#EXT-X-CUE等标签的格式,尤其是广告插入、DRM相关的自定义标签,Akamai的服务端广告插入模块容易输出不符合规范的CUE标记,其他播放器可容错,Roku解析失败 - 检查
#EXT-X-PROGRAM-DATE-TIME标签格式,必须为带时区标识的标准ISO8601格式,Roku OS 10.5及更早版本对该标签校验极严,缺时区、格式不对都会触发报错
- 确认m3u8第一行严格为
- 校验m3u8响应头配置
- 确认m3u8返回的
Content-Type为application/vnd.apple.mpegurl或application/x-mpegURL,不能返回text/plain等其他类型,其他播放器会忽略响应头按内容解析,Roku会做校验 - 确认m3u8响应没有开启gzip/br压缩同时搭配
Transfer-Encoding: chunked传输,旧版本Roku固件对该组合的解压存在已知bug,会读取到损坏的文件内容 - 确认直播流m3u8的
Cache-Control配置合理,不要返回过长的缓存周期,避免Roku读取到过期的旧播放列表
- 确认m3u8返回的
- 做最小化场景验证
- 将出问题的m3u8文件存到本地静态服务器,逐行删除非必要标签、替换分片地址为可正常播放的流地址,每修改一次就测试Roku播放情况,快速定位触发报错的具体标签行
- 跨Roku固件版本测试,确认是否为特定系统版本的解析bug,部分旧版本Roku OS对高版本HLS特性的支持存在缺陷
- Akamai专属配置排查
- 检查是否开启了时移、Live to VOD、服务端广告拼接等功能,这类功能容易在边缘节点输出不符合规范的m3u8内容
- 检查直播打包配置,确认不存在时长为0的无效分片条目,所有
#EXTINF值精确到小数点后三位
内容的提问来源于stack exchange,提问作者Vijay Kumar
相关产品推荐
相关产品推荐

