在上一步中笔者已经成功通过终端使用FFmpeg将视频进行转码,下面笔者将结合PHP代码将这些操作完全自动化实现,这样便可以达到通过手机访问网站,服务端自动完成转码播放的需求,这个过程包括创建虚拟主机、编写展示视频列表、视频自动解码三个部分
4.1 创建虚拟主机
首先笔者需要借助nginx搭建一个web服务,这时便需要修改配置文件,但并不记得nginx配置文件存放位置,此时可以借助如下命令
sudo nginx -t
得到结果如下,在结果中可以便可以看到nginx的配置文件存放位置
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
使用vim编辑器直接编辑nginx配置文件
vim /usr/local/etc/nginx/nginx.conf
然后在配置文件中加入如下参考配置信息
server { listen 8089; server_name localhost; root /Users/song/mycode/work/test/video; location / { index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
4.2 获取视频列表
nginx配置完成之后,便需要编写PHP代码,通过PHP可以获取到目录的视频列表,然后将其输出到网页当中,参考代码如下所示
<?php $list = scandir('/Users/song/video/'); foreach ($list as $key => $val) { if (!in_array(pathinfo($val, PATHINFO_EXTENSION), ['mp4', 'rmvb', 'wmv'])) { continue; } ?> <a href="./encode.php?name=<?= $val ?>" role="button"> <h2><?= $val ?></h2></a> <?php } } ?>
在代码中,首先通过scandir读取文件夹下所有文件,然后进行foreach循环,通过后缀名来判断是否为视频文件,如果是视频文件,则输出一个链接地址方便用户选择。
4.3 进行视频转码
上面的代码在列出视频列表之后,当用户点击链接后就需要使用FFmpeg进行转码,参考代码如下
<?php //接收必要参数 $name = $_GET['name'] ?? '1.mp4'; $forced = $_GET['forced'] ?? 0; $fileName = getFileName($name); $outPath = '/Users/song/video'; $inPath = '/root/download'; $dir = __DIR__; //判断之前是否已经转码,如果不强制转码便先返回 if (is_dir("$outPath/$fileName") && empty($forced)) { header("location:./static/{$fileName}/index.m3u8"); die; } //将目标映射过来 system("ln -s {$outPath} {$dir}/static"); //先创建文件夹 system("mkdir -p {$outPath}/{$fileName}"); //进行转码 $ffmpeg = "docker run -v $outPath:/root/download jrottenberg/ffmpeg:latest"; $cmd = "nohup $ffmpeg -i {$inPath}/{$name} -hls_time 10 -hls_list_size 0 -f hls -r 25 {$inPath}/{$fileName}/index.m3u8 >> ./code.log &"; system($cmd); //延时执行跳转 returnUrl($fileName); function getFileName($filename) { $houzhui = substr(strrchr($filename, '.'), 1); $result = basename($filename, "." . $houzhui); return $result; } function returnUrl($fileName) { echo "<a href='https://www.jb51.net/article/static/{$fileName}/index.m3u8'><h1>正在处理中...点击进行跳转</h1></a>"; die; }
在上面代码当中,考虑文件是否已经被转码,如果已经转码过了直接返回播放地址,否则创建一个存放TS文件的文件夹,然后进行转码,转码的时候使用nohup命令可以让FFmpeg异步执行,然后PHP返回播放地址。
五、检验与测试
通过前面的步骤,笔者已经完整的搭建了一套流媒体服务器,下面将检验这些服务是否能否正常运行,包括视频列表展示、视频转码是否正常、已经转码的视频能否播放
5.1 视频列表
首先通过浏览器打开URL地址如下
:8089/
加载完成之后可以看到如下的视频列表