最近有朋友做了个网站,网站上面放了几个视频,觉得视频播放慢、卡顿,想让我帮忙优化下,今天就介绍个零成本,操作又简单的方法优化网站上视频播放速度


目前很多人网站上放视频,除了用第三方视频平台连接,比如腾讯、优酷、爱奇艺、B站等的视频连接,就是直接将mp4格式的视频放网站目录下,直接嵌入到网站内进行播放,前者缺点就是都有平台广告,后者缺点就是播放慢、卡顿


特别是,如果mp4的视频文件的moov atom元数据被放在mp4文件末尾,那更糟糕,需要下载完整个mp4文件,才会解码媒体信息和关键帧索引,开始播放mp4视频


Nginx零成本、易操作实现网站视频加速_java


而视频越大,moov box就越大,加载就越慢,所以播放mp4文件需要缓存很久,解决方法很简单,就是用现有流行的流媒体的方式


将mp4视频格式,通过ffmpeg工具,转换成m3u8格式的视频文件,这样,一个大的mp4视频文件,就会被切分成自定义分片大小的ts分片文件


这样相当于在自己服务器上,搭建了点播服务,并不需要安装rtmp,并用ffmpeg去做推流,那个是直播的方式,如果推流结束了,视频就无法点击了,当然,可以在推流的过程中将文件切分,但是这里不做直播的情况下,大可不必,不需要安装rtmp重新编译nginx,这里技术上基本没什么难度


具体实现如下:

首先,将mp4视频转换成m3u8格式,用到工具为ffmpeg


ffmpeg在nux源里,通过源yum安装只能安装到2.8版本,如果是ubuntu系统,可以安装到最新版本(CentOS6只有0.6版本),编译安装比较麻烦,就别折腾了,如果需要用到新版本,后面会整理一个通过serverless的方式来做

Nginx零成本、易操作实现网站视频加速_java_02


安装好ffmpeg之后,通过以下命令转换:

ffmpeg -i $mp4_file -c:v libx264 -hls_time 10 -hls_list_size 0 -c:a aac -strict -2 -f hls $path/m3u8_file


这里以libx264和ACC的形式对视频进行输出,其中几个关键参数如下:

-hls_time n: 设置每片的长度,默认值为2。单位为秒

-hls_list_size n:设置播放列表保存的最多条目,设置为0会保存所有片信息,默认值为5

-hls_wrap n:设置多少片之后开始覆盖,如果设置为0则不会覆盖,默认值为0.这个选项能够避免在磁盘上存储过多的片,而且能够限制写入磁盘的最多的片的数量

-hls_start_number n:设置播放列表中sequence number的值为number,默认值为0

-hls_segment_filename name:自定义切片名称


因为ffmpeg转码是CPU密集型计算,如果默认单线程,可以通过-threads n指定多线程进行转码


转码完成后,会在目录下生成一个.m3u8的索引文件和很多.ts切片文件,接着查看下自己nginx中MIME配置

Nginx零成本、易操作实现网站视频加速_java_03

Nginx零成本、易操作实现网站视频加速_java_04

正常nginx默认MIME中支持m3u8流媒体视频格式


接着配置nginx,在原本的server中,添加一个location处理m3u8格式请求

Nginx零成本、易操作实现网站视频加速_java_05


最后只需要在网站中将视频地址后缀改为m3u8即可,注意chrome等PC浏览器不支持