视频播放-流媒体

## 前言 ##
作为PHP开发者,肯定好奇视频相关的站点是怎么实现的。比如爱奇艺,优酷,腾讯视频等等。
起初我想不就是用video标签,放个视频地址就OK了吗,还用想吗。后来仔细想想,看来是我想多了。比如怎么防止别人盗取视频的等等问题来了。于是看看别人网站是怎么实现的,参考了2个站点,一个是PHP中文网,还有一个是什么来着(搞忘了),发现视频播放的地址都是以"blob:[http://xxxx](#)"开头的。百度了下相关的知识,还发现一个问题,网上说的:video标签src放一个视频的地址,得等到整个视频下载完后才能播放。后面我搭建虚拟机测试了一下,600MB+大小的视频,视乎没把整个视频下载完就可以播放呀,可能因为是本机的原因吧,所以网速很快。
总结出2个问题:
1.视频怎么防止别人盗取。
2.如果要等整个视频下载完才能播放的话,会出大事的。第一是用户等不起这个时间,第二是浪费服务器资源。很早之前看优酷的时候,我记得就是看一段加载一段的,这个问题肯定有技术解决方法的。
通过搜索了好大会,才搞懂流媒体这个概念。整个流程就是把mp4这些视频进行切片成一小段一小段的,这样前端加载的时候就不会加载整个视频了。有个方案就是使用ffmpeg这个开源软件,把mp4视频文件切成m3u8的视频(.m3u8文件只是一个索引文件,一小段一小段视频文件是.ts的文件),m3u8的hls(格式还是编码,或者协议,不纠结这个叫法,这个是苹果公司发明出来的)对非苹果的浏览器,是无法直接播放的,需要载入2个js进行支持(需要载入2个js问题不大)。

## centos7安装ffmpeg ##

1.升级yum(这一步可以忽略)
sudo yum install epel-release -y
sudo yum update -y

2.安装Nux Dextop Yum源
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

3.安装FFmpeg和FFmpeg开发包
sudo yum install ffmpeg ffmpeg-devel -y

4.测试
ffmpeg -version

## ffmpeg的使用 ##

1.获取截图
ffmpeg -y -i 1.mp4 -ss 00:00:01 -vframes 1 -q:v 1 output.jpg
-y 不经过确认,直接覆盖同名文件
-i 指定输入文件
-ss 指定截图时间
-vframes 指定截图一帧
-q:v 指定图片执行(1~5之间,1为质量最高)
最后一个参数是输出的文件名

2.将mp4切片成m3u8(这个命令就不注释,看了参数大致都能猜到干嘛的)
ffmpeg -i test.mp4 -c:v libx264 -c:a aac -strict -2 -f hls -hls_time 15 -hls_list_size 0 test.m3u8

假装现在视频已经切片好了。那还有个问题就是防盗,防盗也只能是相对的,可以给m3u8的视频地址用PHP文件来代替,用php文件来读取m3m8文件的内容。生成这个地址需要带个token,可以设置这个token有效期为5小时,或是是视频时长的3倍,如果token失效就不返回这个文件。还有一种就是通过加密手段,对每个分片加密,然而也需要相应的播放插件来解密播放。一切可见的数据,总是有办法给弄下来的,防盗这个问题也别太勉强,m3u8的视频文件,可以把所有分片都下载下来,然后通过ffmpeg进行转换成mp4。

视频播放这块算是完了。如果要我是设计一个视频网站的话。我会把网站服务器和存视频的服务器给分开。第一是为了方便管理,第二是项目服务器和存视频的服务器带宽和性能都是有差距的。数据库的共话用一个就可以了,视频表和m3u8切片的索引表分开。有视频需要进行切片时,把切片任务加入队列中,由存视频的服务器进行处理,处理完之后把相应信息放至数据库中。如果是小站点的话,就没必要搞这么麻烦了,直接放在一个服务器就可以了。

video.zip

202006131001.jpg

等后面有时间了,再研究语音通话和视频直播吧。