PHP结合Ffmpeg快速搭建流媒体服务的实践记录(2)

在上一步中笔者已经成功通过终端使用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/

加载完成之后可以看到如下的视频列表

PHP结合Ffmpeg快速搭建流媒体服务的实践记录

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fb478bd570189fa1070934cda1cb7282.html