写点什么

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

发布于: 2021 年 02 月 20 日


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


目前很多人网站上放视频,除了用第三方视频平台连接,比如腾讯、优酷、爱奇艺、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 支持


发布于: 2021 年 02 月 20 日阅读数: 39
用户头像

有一点想法的电脑维修工 2020.07.14 加入

一位有些想法的技术爱好者

评论

发布
暂无评论
Nginx零成本、易操作实现网站视频加速