PHP + FFmpeg 关于视频网站的视频切片与防盗加密

摘要:FFmpeg 工具的下载安装,什么是 m3u8 格式视频,FFmpeg 怎么将 mp4 视频切成 m3u8 格式,怎么对切好的视频进行一个防盗加密。

YUM 安装 FFmpeg 多媒体处理工具

我采取的是最简单的 yum 安装,大家也可以使用源码安装,直接在 FFmpeg 官网下载源码进行编译即可。FFmpeg 百度百科 和 FFmpeg 维基百科官网地址 和 下载地址

1、在 centos 7 上,您可以使用以下命令安装 nux dextop yum 存储库:

rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

2、安装 FFmpeg 和 FFmpeg 开发包

yum install ffmpeg ffmpeg-devel -y

3、确认FFmpeg的安装:

ffmpeg

4、此命令提供有关系统上安装的FFmpeg的详细信息。如果要了解有关FFmpeg的更多信息,请输入:

ffmpeg -h


FFmpeg 工具安装参考链接:

https://www.jb51.net/article/157361.htm

https://www.vultr.com/docs/how-to-install-ffmpeg-on-centos


为什么要把 MP4 格式的切分成 M3U8 格式

mp4 很简单,就是一个普通的视频,拿过来就可以播放,但是这种视频有两个主要的弊端:

1、mp4 的关键帧元素往往很大,需要加载很长时间才能开始播放,网速不好的情况缓冲加载就要20多秒的时间,用户早已急不可耐。

2、当用户打开一个视频播放的时候,浏览器会持续请求下载 mp4 文件直到下载完成,就算是用户暂停视频播放浏览器也会持续这种下载状态,如果这个视频文件是 500mb 则会请求服务器下载500mb 文件,是 1g 则会不停下载 1g,给服务器硬盘和宽带造成很大浪费和压力。因为有可能一个 120 分钟的视频,用户看 10 分钟就不看了,但其实后面的视频播放器已经缓冲下来了,用户并没有进行一个实际的观看。

那么对于 mp4 带来的这些弊端怎么改变呢?于是我们参考优酷土豆等大型视频网站系统的播放文件,发现他们的视频文件都是分段播放的,也就是 m3u8 格式。即把一个大的视频文件按照一定大小或时长把一个视频分为 n 段播放,这样的优势是打开视频加载速度快,可以达到秒播,另外一个优势是当视频播放第 n 段的时候,浏览器会下载 n+1 段,n+2 则不会下载,大大缓解了服务器硬盘和宽带压力,可知道高昂的宽带成本才是视频网站的最大压力。这样的视频文件处理方式得到了大量客户的一致好评。


M3U8 视频格式和播放原理

m3u8 是 unicode 版本的 m3u,用 utf-8 编码。"m3u" 和 "m3u8" 文件都是苹果公司使用的 HTTP Live Streaming(HLS) 协议格式的基础,这种协议格式可以在 iphone 和 macbook 等设备播放。m3u8 文件其实是 HTTP Live Streaming(缩写为 HLS) 协议的部分内容,而 HLS 是一个由苹果公司提出的基于 HTTP 的流媒体网络传输协议。

hls 是新一代流媒体传输协议,其基本实现原理是将一个大文件进行切分,将该分片文件资源路径录于 m3u8 文件内,其中附带一些额外信息(比如该资源的带宽信息等等......)用于提供给客户端。客户端依据该 m3u8 文件即可获取对应的媒体资源,进行播放。

m3u8 文件实质是一个播放列表(playlist),内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。我在一个视频网站随便找了一个 m3u8 文件 https://hla.xxxxxx.com/hls/assist/1CMDM04MG0/1/1CMDM04MG0-hls.m3u8?auth_key=1598012145-0-0-671f06d46d32c6f506325f3674102932,打开之后内容如下:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.000000,
1CMDM04MG0-hls0.ts?auth_key=1598012145-0-0-ba2fbf93c755a759b689d2be17b83040
#EXTINF:10.000000,
1CMDM04MG0-hls1.ts?auth_key=1598012145-0-0-df65ea0267b0d7105278ed88516db087
#EXTINF:10.000000,
1CMDM04MG0-hls2.ts?auth_key=1598012145-0-0-032a906993ce7d87a5c89e24355efb6d
#EXTINF:10.000000,
1CMDM04MG0-hls3.ts?auth_key=1598012145-0-0-b8544f8999b17c7defd3a3260a4a0963
#EXTINF:10.000000,
......
#EXTINF:10.000000,
1CMDM04MG0-hls46.ts?auth_key=1598012145-0-0-e7e8c5eb885f75e9e633c0f026caebb0
#EXTINF:5.520000,
1CMDM04MG0-hls47.ts?auth_key=1598012145-0-0-aced9a048dbd4d6781c7757dc90a7dda
#EXT-X-ENDLIST

一个 m3u8 文件很小,正常来讲只有几 kb。打开 m3u8 文件,内容是一个由 ts 文件组成的片段资源列表。比如上面这个 m3u8 文件就是由 47 个 ts 文件组成,这些 ts 文件组合起来就是一个完成的 mp4 视频。网上有很多 m3u8 视频下载器,直接把 m3u8 地址粘贴进去,下载好之后就是一个完成的 mp4 的视频。

ts 路径可以是绝对路径也可以是相对路径,如果是绝对路径那么就按照指定的 ts 路径去播放,如果是相对的,那么就相对于 m3u8 路径去获取。比如上面的 ts 文件路径就是相对的,其拼接好的完整路径为:https://hla.xxxxxx.com/hls/assist/1CMDM04MG0/1/1CMDM04MG0-hls0.ts?auth_key=1598012145-0-0-ba2fbf93c755a759b689d2be17b83040。

尽管可以在 m3u8 文件中使用绝对路径指定媒体片段资源路径,但是更好的选择是使用相对路径。相对路径相较于绝对路径更轻便,同时是相对于 m3u8 文件的 URL。相比之下,绝对路径增加了 m3u8 文件内容(更多字符),增大了文件内容,同时也增大了网络传输量。

对于点播来说,客户端只需按顺序下载上述片段资源,依次进行播放即可。而对于直播来说,客户端需要 定时重新请求 该 m3u8 文件,看下是否有新的片段数据需要进行下载并播放。


FFmpeg 将 MP4 视频切成 M3U8

我们先准备一个mp4 文件,然后将它放到 /home/ffmpeg/mp4/12345/ 目录下。

[www@localhost 12345]$ pwd
/home/ffmpeg/mp4/12345
[www@localhost 12345]$ ll
总用量 13700
-rwxr--r-- 1 www www 14024722 4月  28 15:49 jt.mp4

然后准备一个目录存放 m3u8 文件和切好的媒体片段资源。比如将 m3u8 文件和片段资源放到 /home/ffmpeg/m3u8/12345/  文件目录下。

[www@localhost 12345]$ pwd
/home/ffmpeg/m3u8/12345
[www@localhost 12345]$ ll
总用量 0

准备好 mp4 文件和存放 m3u8 文件目录后。那么待会切好后的 m3u8 路径大致如下 /home/ffmpeg/m3u8/视频id/xxxxxx.m3u8,然后 ts 是和 m3u8 同级别的路径,也就是 /home/ffmpeg/m3u8/视频id/xxxxxx.ts 路径。需要注意的是要将 root 用户切换成 www 用户,因为待会要用 php 去操作 FFmpeg 命令。接来下使用 FFmpeg 命令进行对视频的切分。

[www@localhost ~]$ ffmpeg -y -vol 256 -i /home/ffmpeg/mp4/12345/jt.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 10 -hls_list_size 0 /home/ffmpeg/m3u8/12345/jt.m3u8

FFmpeg 参数有很多,我们可以根据:来查看每个参数详解,此处用 FFmpeg 用到参数详解如下:

-y 覆盖输出文件
-vol 设置音量 256 为标准音量
-i FFmpeg 程序把 -i 参数指定的若干文件内容读入到内存,其实就是要切片的 mp4 视频地址,可以是 url 也可以是路径
-c:v libx264 调用外部的 libx264 编码器来编码
-c:a aac 使用 aac 编码器进行编码
-strict -2 使用 FFmpeg 自带的 aac 音频编码要带上-strict -2 参数就可以了
-f hls 强制输入或输出文件格式。通常会自动为输入文件检测格式,并从输出文件的文件扩展名中猜测该格式,因此在大多数情况下不需要此选项
-hls_time 10:每个 ts 文件 10 秒左右。这个会根据具体情况,尽量维系在 10 秒一个 ts
-hls_list_size 0:m3u8 索引里保留所有的 ts 路径

如果没有报错,那么一个视频就会按照上述的参数进行切分,文件的切分信息会放到 /home/ffmpeg/m3u8/12345/jt.m3u8 路径下。而切分好的 m3u8 文件和 ts 文件都会放到 /home/ffmpeg/m3u8/12345 路径下。我们可以查看 m3u8 切片目录,可以看到一个 m3u8 文件对应多个 ts 文件。

[www@localhost 12345]$ pwd
/home/ffmpeg/m3u8/12345
[www@localhost 12345]$ ll -h
总用量 20M
-rw-rw-r-- 1 www www 3.5M 8月  25 17:36 jt0.ts
-rw-rw-r-- 1 www www 2.9M 8月  25 17:36 jt1.ts
-rw-rw-r-- 1 www www 3.9M 8月  25 17:36 jt2.ts
-rw-rw-r-- 1 www www 2.1M 8月  25 17:36 jt3.ts
-rw-rw-r-- 1 www www 2.8M 8月  25 17:37 jt4.ts
-rw-rw-r-- 1 www www 2.5M 8月  25 17:37 jt5.ts
-rw-rw-r-- 1 www www 2.1M 8月  25 17:37 jt6.ts
-rw-rw-r-- 1 www www  268 8月  25 17:37 jt.m3u8

从切好的结果可以看出,m3u8 文件很小,而 ts 文件内容是要稍微大点的。我们打开 m3u8 文件查看,文件内容如下。

[www@localhost 12345]$ cat jt.m3u8 
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:15
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:11.840000,
jt0.ts
#EXTINF:8.840000,
jt1.ts
#EXTINF:14.560000,
jt2.ts
#EXTINF:7.200000,
jt3.ts
#EXTINF:8.480000,
jt4.ts
#EXTINF:11.000000,
jt5.ts
#EXTINF:10.240000,
jt6.ts
#EXT-X-ENDLIST

由上可以看到 m3u8 文件是由多个 ts 文件组成的,现在市面上大部分的播放器都支持 m3u8 格式。m3u8 文件实质是一个播放列表(playlist),内部信息记录的是一系列媒体片段资源,顺序播放该片段资源,即可完整展示多媒体资源。这个文件和上面我们介绍 m3u8 文件内容无异。


结束语:感谢您对本网站文章的浏览,欢迎您的分享和转载,但转载请说明文章出处。
Top