这阵子在搞一个流媒体项目,视频这玩意儿加载起来那叫一个慢,用户体验直接掉下来好几档。我就琢磨着,得赶紧把这个速度提上去,不然这项目搞出来没人看,那不是白费劲吗?于是我就开始琢磨怎么快速实现网络视频加速。这事儿摸索下来,还真让我总结出几招挺管用的方法。
我最先想到的就是用内容分发网络,也就是常说的CDN。这玩意儿是解决视频加速最直接的办法。我当时手上有很多视频素材,分布在不同的服务器上,用户访问的时候,还得绕老远去拉数据,那能不慢吗?我选择了国内一个挺有名的服务商,注册账号,把我的视频源站地址一填,然后上传文件,等待分发。
操作过程就是:
等缓存好了之后,用户访问的地址就不再是我自己的服务器,而是CDN提供的加速节点地址。这个效果立竿见影,特别是对于那些跨地域访问的用户,延迟一下子就降下来了。

光有CDN还不够,我发现有些视频文件特大,即使用CDN加速,首屏加载速度还是很慢。我就想,干脆把大视频拆成小块儿,用户想看哪部分就先加载哪部分,这就是视频切片。我用FFmpeg把MP4切成了HTTP Live Streaming(HLS)格式。这东西把视频拆成一小段一小段的TS文件,再加一个M3U8播放列表文件。
具体实践中,我当时写了个脚本来处理已上传的视频:
这样做的好处是,播放器可以边下载边播放,用户不用等整个文件下载完才能看。而且我还可以根据用户的网速动态切换不同清晰度的切片,这也是加速体验的一部分。
后来我琢磨,传输协议也是个瓶颈。我原来的Web服务器还跑在HTTP/1.1上,那个多路复用能力不行,一个请求占着管道,后面的请求就得等着。我把服务器直接升级到了支持HTTP/2,后来干脆试着用HTTP/3。

我更换了Nginx的配置,加了相关的模块,重启服务。HTTP/2带来的并发请求能力明显增强,浏览器可以同时请求多个视频切片,速度自然就快了。HTTP/3基于UDP的QUIC协议,那感受更不一样,丢包重传机制在移动网络环境下表现特别卡顿少了挺多。
播放器端也不能含糊。我用的Web播放器,我把它的预加载缓冲设置调大了点,让它在用户观看当前片段的能提前把后面两三个片段下载我还检查了播放器的并发连接数,确保它能充分利用CDN和HTTP/2带来的速度提升。
我对着播放器的配置文档研究了半天,把buffer时间从默认的5秒改到了10秒,同时限制了最大连接数,避免把CDN打爆了。把CDN、切片、新协议和播放器设置都给捋顺了,我这视频加载速度算是彻底脱胎换骨了,用户反馈也好了很多。