最近有朋友做了个网站,网站上面放了几个视频,觉得视频播放慢、卡顿,想让我帮忙优化下,今天就介绍个零成本,操作又简单的方法优化网站上视频播放速度
目前很多人网站上放视频,除了用第三方视频平台连接,比如腾讯、优酷、爱奇艺、B站等的视频连接,就是直接将mp4格式的视频放网站目录下,直接嵌入到网站内进行播放,前者缺点就是都有平台广告,后者缺点就是播放慢、卡顿
特别是,如果mp4的视频文件的moov atom元数据被放在mp4文件末尾,那更糟糕,需要下载完整个mp4文件,才会解码媒体信息和关键帧索引,开始播放mp4视频
而视频越大,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的方式来做
安装好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默认MIME中支持m3u8流媒体视频格式
接着配置nginx,在原本的server中,添加一个location处理m3u8格式请求
最后只需要在网站中将视频地址后缀改为m3u8即可,注意chrome等PC浏览器不支持直接播放m3u8格式,PC端只有safari支持
标签:视频,ffmpeg,m3u8,网站,hls,Nginx,mp4,播放 From: https://blog.51cto.com/u_64214/8121988