播M3U8的时候画面突然花了,或者整屏发绿,这种问题我遇到过太多次。花屏和绿屏虽然表现不一样,但背后的原因有不少重叠。下面把常见的几种情况和解决办法列出来,大家对照着排查。
很多花屏问题根本不是播放器的事,而是源视频本身的编码就有问题。比如H.264编码的profile和level设置得太高,某些解码器不支持;或者B帧用得不规范,导致参考帧错乱。
我印象最深的一次,一个客户的直播流用Baseline Profile就正常,换成High Profile之后部分安卓手机必花屏。后来排查发现是那些手机的硬解只支持到Baseline,软解又不够力,只能降低编码规格。
如果你用FFmpeg转码,建议加上这些参数保底:
-profile:v baseline -level 3.0 -pix_fmt yuv420p
这样兼容性最好,虽然画质可能不是最优,但至少不会花屏。
M3U8是索引文件,真正的视频数据在那些.ts切片里。如果某个切片下载不完整、CDN缓存了损坏的版本、或者传输过程中丢包,播放器解码到那一块就会花屏。
判断方法:看花屏是不是总是在同一个时间点出现。如果是,那基本就是对应的TS切片有问题。你可以单独下载那个TS文件,用播放器试一下,确认是它的问题。

整屏发绿的情况,我在Chrome里遇到过几次。一般是显卡驱动或者浏览器的硬解解码器出问题了,解码出来的YUV数据在转成RGB的时候色度通道错乱,画面就绿了。
解决办法:在浏览器设置里关闭硬件加速,或者在播放器里强制使用软解。VLC里可以在首选项 -> 输入/编解码器 -> 硬件加速解码,改成"禁用"。
有些直播源在推流过程中会动态切换分辨率,比如从720P切到480P。如果M3U8文件没处理好这种切换,播放器可能会花屏几秒,直到适应新的分辨率。
这种情况比较无解,是源站的问题。观众端能做的只有刷新页面,让播放器重新初始化。
遇到画面问题,按这个顺序排查:先换播放器试试(排除解码器问题) -> 检查TS切片是否完整 -> 查看编码参数 -> 关闭硬件加速。大部分情况都能定位到原因。