一、HLS中使用VP9的核心背景与应用场景

1.1 为什么想尝试VP9

很多做在线视频的朋友都知道,HLS是现在最常用的视频播放协议,之前大家基本都用H.264的视频编码格式,因为老设备都支持,但H.264太占空间,同等清晰度下,比VP9多花30%左右的带宽成本。去年我帮一个小视频平台做优化,他们的用户里近2年的新手机(安卓10+、iOS15+)占了60%,想着能不能给这部分用户换VP9,省点带宽,毕竟平台每个月的带宽费也是不小的开销。

1.2 适合用VP9的场景

不是所有视频平台都适合,主要适合这几类:一是新用户占比高的平台,比如短视频App、年轻群体为主的视频站;二是点播类内容,因为点播可以提前转码,不用像直播那样等编码速度;三是带宽成本压力大的平台,比如海外或有大量海外用户的,VP9的压缩优势更明显。

二、跨平台兼容性的具体情况

2.1 哪些设备能播VP9

我之前做过实测,新设备的支持率挺高:安卓10以上的Chrome、Firefox浏览器都没问题,iOS15以上的Safari(包括苹果的手机、平板、电视)也支持,桌面端的Chrome、Edge、Firefox全系列都支持VP9。但老设备就不行:比如iOS14及以下的iPhone8之前的机型,安卓4.4以下的旧平板,还有很多智能电视的2019年前的系统,打开VP9视频直接黑屏,或者提示“无法播放此视频”。

2.2 兼容性的实测风险

之前那个视频平台的老用户里,有15%用的是3年前的安卓平板,要是直接全量换VP9,这部分用户就看不了视频,直接流失了。所以兼容性不是“能或不能”,而是“要兼顾老用户”,不能只盯着新设备的优势。

三、TS分段封装的冲突与解决

3.1 踩坑:TS里放VP9会翻车

HLS的视频都是切成一个个小片段,之前大家用的是TS格式,这个格式主要适配H.264编码,我一开始直接用ffmpeg把视频转成VP9+TS分段,结果播放器(常用的HLS.js)直接加载失败,报“不支持的视频编码”。查了资料才知道,TS格式的规范里,对VP9的帧结构支持不完整,很多播放器的TS解析器没处理好,就会出错。

3.2 解决方案:用fMP4替代TS

后来发现HLS的新版本(HLSv6)支持fMP4格式的分段,这个格式对VP9的兼容性更好,只要加个参数就能解决。这里放完整的转码示例,技术栈是ffmpeg:

# 用ffmpeg将原视频转成适配HLS的VP9格式,fMP4分段解决封装冲突
ffmpeg -i original_video.mp4 \
  -c:v libvpx-vp9 \ # 视频编码用VP9,libvpx-vp9是ffmpeg里专门支持VP9的编码器
  -c:a libopus \ # 音频用Opus,和VP9搭配更省空间,比常用的AAC压缩率高
  -hls_time 10 \ # 每段视频切片时长10秒,HLS常用的分段长度
  -hls_fmp4 1 \ # 关键参数:用fMP4格式做HLS分段,替代旧的TS格式,解决VP9解析问题
  -hls_list_size 0 \ # 保留所有视频切片,不会自动删除旧片段
  -vf scale=1280:720 \ # 转成720P分辨率,适配大部分移动端设备
  vp9_720.m3u8

这个命令转出来的视频,用新设备播放完全没问题,我测了安卓12的手机,加载速度比H.264快了1秒,清晰度一样,流量少了2.3MB左右。

四、老设备的回退策略与取舍

4.1 必须做双版本回退

既然老设备不支持VP9,那最简单的办法就是同时转两个版本的视频:一个VP9给新设备,一个H.264给老设备,然后在HLS的主播放列表里写上两个版本,浏览器会自动选自己能播的那个。这个办法虽然多花一点转码成本,但能保住所有用户,性价比很高。

4.2 双版本的配置示例

这里的主播放列表(m3u8文件)的配置示例,确保不同设备能自动适配:

#EXTM3U
#EXT-X-VERSION:7
# 第一个版本是VP9,适合新设备,带宽设为1800kbps(比H.264低20%)
#EXT-X-STREAM-INF:BANDWIDTH=1800000,CODECS="vp09.00.10.08,opus",RESOLUTION=1280x720
vp9_720.m3u8
# 第二个版本是H.264,适合老设备,带宽设为2200kbps,分辨率一致
#EXT-X-STREAM-INF:BANDWIDTH=2200000,CODECS="avc1.4D401F,mp4a.40.2",RESOLUTION=1280x720
h264_720.m3u8

这里要注意两个版本的分辨率、帧率必须一样,不然播放时切换会卡顿,而且VP9的带宽可以设得比H.264低,毕竟它压缩率高,这样总流量会更省。我测了之后,两个版本的文件大小加起来,比只转H.264的版本还小10%左右,很划算。

五、实际测试的结论与最终建议

5.1 可行性总结

经过实测,在HLS里用VP9是完全可行的,但必须满足两个条件:一是用fMP4分段替代TS,二是做双版本回退。这样既发挥了VP9省带宽的优势,又不流失老用户,适合新用户占比60%以上的平台。

5.2 注意事项

  • 实时直播慎用VP9:因为VP9的编码速度比H.264慢,会增加服务器的CPU负载,直播平台的话还是用H.264更好;
  • 不要追求太低的码率:VP9如果码率太低,会出现模糊、色块,720P的话设1.5-2Mbps就够,不要低于1.2Mbps;
  • 尽量用Opus音频:Opus比AAC省30%的空间,和VP9搭配,整个视频文件能再小10%左右。

5.3 最终建议

如果你的平台新用户占比超过50%,可以尝试用VP9+双版本的方案,测试下来带宽能省20%-35%,老用户的播放成功率也能保持在99%以上。我之前帮朋友做的美食视频站,换了这个方案后,每个月的带宽费少了12%,用户投诉播放失败的情况几乎没了。