一、Master 主索引里面容易被忽略的 CODECS 字段
很多做 HLS 多码率业务的同学,配置 Master 主索引的时候,只关注 BANDWIDTH 带宽数值,常常忽略CODECS这个参数。#EXT‑X‑STREAM‑INF标签下的 CODECS,用来告诉播放器每一路子流使用的视频、音频编码格式。
很多新手直接网上复制示例,随便抄一串 CODECS 字符串,或者干脆不写这个字段。不写虽然部分播放器可以勉强播放,但是会带来兼容性问题:浏览器无法提前判断自己支不支持该路子流编码,会先下载分片才发现解码失败,出现切换清晰度直接黑屏。
现象很迷惑:手动强制切换到该档位可以播放,但是 ABR 自适应码率不会选择这一档;部分浏览器直接跳过该子流;切换清晰度瞬间黑屏转圈。VLC 播放器容错高,就算 CODECS 写错或者缺失,照样可以播放,网页 hls.js 环境就容易暴露问题。
调试 Master 索引 CODECS 相关故障,我会使用 m3u8live.cn,查看完整 M3U8 的 #EXT‑X‑STREAM‑INF 内容,核对 CODECS 字符串,观察各档位切换表现。
二、CODECS 参数常见踩坑现象
坑 1:直接省略 CODECS 字段,完全不填写
现象:部分浏览器自适应逻辑异常,不会选用该码率档位;切换档位时,播放器要先下载分片之后,才发现编码是否支持,增加失败概率。 根因:缺少编码提示,播放器没有办法预先判断设备解码能力,只能下载分片之后才做检测。
坑 2:CODECS 字符串复制粘贴错误,字符写错、顺序颠倒
CODECS 里面视频编码在前,音频编码在后,字符串格式有严格规范。复制网上示例复制错字符,导致浏览器识别编码失败,直接放弃该子流。
坑 3:多路子码率,部分档位写 H265,但是 CODECS 依旧填写 H264 的标识
现象:实际分片是 H265,但是 CODECS 写的是 avc1 开头(H264 标识)。播放器以为是 H264,切换过去拿到分片发现编码不匹配,解码失败黑屏。
坑 4:多音轨、多语种场景,CODECS 没有和实际音轨对应
Master 搭配 #EXT‑X‑MEDIA 多音轨的时候,CODECS 只写视频编码,音频部分遗漏,部分浏览器会出现音轨识别异常。
三、简单搞懂 CODECS 字符串格式
简单通俗理解:CODECS="avc1.4D401F,mp4a.40.2"
- avc1 开头代表 H.264 视频编码;
- mp4a.40.2 代表 AAC 音频编码;
- 逗号分隔,视频在前,音频在后。
如果分片实际是 HEVC (H265),编码标识是 hev1 开头,不能继续写 avc1。
不要自己瞎编这一串字符串,可以通过 ffprobe 拿到分片真实的 codecs 信息,复制粘贴到 Master 索引,不要凭记忆手写。
四、排查实操步骤
第一步,Master 主索引粘贴网页调试工具,查看原始 M3U8 文本,查看每一路 #EXT‑X‑STREAM‑INF 的 CODECS。 第二步,使用 ffprobe 解析对应子 M3U8 的 TS 分片,拿到真实编码的 codecs 字符串,做文本比对。 第三步,手动挨个切换全部清晰度档位,观察切换之后播放状态。
如果工具切换就黑屏,优先核对 CODECS 与分片真实编码是否匹配;如果工具切换全部正常,业务页面异常,则排查业务 hls.js 配置。
五、业务开发运维建议
- 多码率 Master 索引,尽量每一路子流都填写正确 CODECS,不要省略该字段。
- CODECS 字符串不要凭手写、不要随便抄网上示例,使用 ffprobe 读取真实分片编码信息。
- H265 分片务必使用 hev1 系列标识,不要继续写 avc1 (H264)。
- 验收不能只依靠 VLC 播放器,VLC 会忽略 CODECS 错误,要以浏览器 hls.js 切换表现为准。
六、总结
Master 主索引的 CODECS 参数,用来告诉播放器子流真实音视频编码。省略或者填写错误,不会直接导致完全不能播放,但是会造成自适应码率异常、切换清晰度黑屏等隐性 BUG。VLC 播放器容错高会掩盖这类问题,网页浏览器会严格解析该字段。借助网页调试工具查看 Master 原始索引,配合 ffprobe 获取分片真实编码信息,保证 CODECS 和实际分片编码完全匹配,规避多码率业务的兼容隐患。