手机版

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

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

一.背景

Ffmpeg应该是目前最强大的视频管理程序。当你需要截取视频的第一帧,转换视频类型,截取gif图片等等,ffmpeg绝对是最好的扩展

我想把收藏的一些电影放在网站上,随时播放,但是遇到了一个问题,就是如果MP4文件直接放在网站目录下,手机播放之前必须下载完整的视频,但是如果是通过外网传输的话,真的不现实。

为了解决这个问题,我想过设置一个流媒体服务,让手机边看边下载。查询了一些资料,了解到视频需要先分小块传输,比如将MP4转码为M3U8格式,查询相关转码方式。主流的方式是使用ffmpeg作为开源工具。

二、操作总结

安装fmpeg服务并构建功能测试3。构建ffmpeg

视频转码的工具可能有很多,但ffmpeg是最开源、最常用的工具,具体功能这里不做详细说明;安装这个工具的方法有很多,比如apt安装、源代码安装、docker安装等。但是docker是跨平台的,所以我将在这里以docker安装为例

3.1图像下载

首先,我需要下载相应的docker映像。参考命令如下

在执行docker pull jrottenberg/ffmpeg命令的过程中,将从一定距离下载图像,该距离由当前网络带宽决定。下载后,您可以看到以下参考信息

使用默认标签:最新状态:从jrottenberg/ffmpegb 234 f 539 F7 a 1:拉出完成55172d 420 b 4:拉出完成5b a5 bbeb 91:拉出完成43ae2841ad7a:拉出完成f6c9c6de4190:拉出完成2a0ef76bfa54:拉出完成40 df 770

下载容器后,您可以使用一些命令来验证它是否可以正常运行,如以下参考命令所示

执行docker run jrottenberg/ffmpeg命令后,将返回以下结果

超快音频和视频编码器: ffmpeg[选项][[插入选项] -i插入].{[outfile选项] outfile}.省略音频选项:-帧数设置要输出的音频帧数-AQ质量设置音频质量(特定于编解码器)-ar速率设置音频采样率(以Hz为单位)-ac通道设置音频通道数-禁用音频-acodec编解码器强制音频编解码器(“复制”以复制流)-音量更改音频音量(256=正常)-af filter_graph设置音频过滤器sSubtitle选项3360-s大小设置帧大小(WxH或缩写)-sn禁用字幕-scodec编解码器强制字幕编解码器(“复制”以复制流)-忽略Fourcc-fix _ sub _ duration fix字幕持续时间-canvas _ size设置canvas size (wxh或缩写)-spre预设将字幕选项设置为指示的预设3.3,以查看支持协议

FFmpeg支持多种输入输出协议。例如,可以选择文件协议作为源,选择hls协议作为输出结果。可以通过以下命令查看特定的支持协议

在docker run jrottenberg/ffmpeg-protocols执行该命令后,参考结果如下

ffmpeg版本3.4.2版权所有(c) 2000-2018使用gcc 5 . 4 . 0(Ubuntu 5 . 4 . 0-6 Ubuntu 1 ~ 16 . 04 . 9)构建的FFmpeg开发人员20160609配置:-disable-debug-disable-doc-disable-ffplay-enable-shared-enable-avresample-enable-libopencore-amrnb-enable-lib opencore-amrwb-enable-GPL-enable-libass-enable.省略支持的文件协议:输入:异步缓存concat cryptodata.省略Output:加密文件.省略tls udp3.4转换测试

现在我用FFmpeg对视频进行转码。命令很简单。首先我需要通过-v挂载容器中视频所在的目录,然后使用-i选项在容器中找到对应的视频文件;

然后,您可以对编码进行一些选择。例如,-hls_time 10是在10秒内输出一个ts文件,-hls_list_size 0是记录m3u8文件中的所有TS文件(默认是记录最后5个TS文件),最后填写文件输出路径。具体参考命令如下:

当正在执行docker run-v/users/song/video :/root/download jrottenberg/ffmpeg 3360 latest-I/root/download/1 . MP4-HLS _ time 10-HLS _ list _ size0-f HLS/root/download/index . m3u 8命令时,

metadata : major _ brand : mp42 minor _ version : 0 compatible _ brands : mp42mp 41编码器: lavf 57 . 83 . 100 Stream # 0:0(eng): video : h264(lib x264),yuv420p(渐进式),1920x1080,q=-1 - 1,30 fps,90k tbn,30 tbc 128 kb/s(默认)Metadata:创建_时间: 2018-08-21t 15:09336024.000000 z处理程序_name : Alias Data Handler编码器: lavc 57 . 107 . 100 AAC frame=82 Fps=12 q=29.0 size=n/a时间=00:000:0000

现在,作者将删除刚才的所有TS文件,这将由下面的自动化完成。

四是服务建设

在前一步中,作者已经通过终端成功地使用FFmpeg对视频进行了转码。接下来,笔者将用PHP代码将这些操作完全自动化,让服务器通过手机访问网站自动完成转码和播放。该过程包括创建虚拟主机、编译显示视频列表和自动解码视频。

4.1创建虚拟主机

首先需要借助nginx构建web服务,然后需要修改配置文件,但是不记得nginx配置文件的存储位置。此时,我可以使用以下命令

sudo nginx -t得到的结果如下,在结果中可以看到nginx的配置文件的存储位置

Nginx :配置文件/usr/local/etc/Nginx/nginx . conf语法正常nginx :配置文件/usr/local/etc/nginx/nginx . conf测试成功使用vim编辑器直接编辑nginx配置文件

vim/usr/local/etc/nginx/nginx . conf然后将以下参考配置信息添加到配置文件

服务器{ listen 8089server _ name localhostroot/Users/song/my code/work/test/video;位置/{索引index.html index.htm index.php;}位置~ \。PHP $ { fastcgi _ pass 127 . 0 . 0 . 1:9000;index.php指数;fastcgi _ param SCRIPT _ FILENAME $ document _ root $ fastcgi _ SCRIPT _ name;包括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 class=' BTN BTN-默认BTN-视频btn-lg' href='。/encode.php?名称=?=$val?角色='按钮' h2?=$val?/h2/a?php }}?在代码中,首先通过scandir读取文件夹中的所有文件,然后进行foreach循环,通过后缀名称判断是否是视频文件。如果是视频文件,输出链接地址,方便用户选择。

4.3视频转码

以上代码列出视频列表后,当用户点击链接时,需要使用FFmpeg进行转码。参考代码如下

?Php//接收必要的参数$name=$_GET['name']?1 . MP4 ';$forced=$_GET['forced']?0;$ fileName=getFileName($ name);$ OutPath='/用户/歌曲/视频';$ InPath='/root/download ';$ dir=_ _ DIR _ _//确定之前是否做过转码。如果不强制转码,则返回if(is _ dir($ outpath/$ filename ')为空($ forced)){ header(' location :/static/{ $ filename }/index . m3u 8 ');死去;}//将目标映射到系统(' ln-s { $ outpath } { $ dir }/static ');//首先创建文件夹系统(' mkdir-p { $ outpath }/{ $ filename } ');//转码$ ffmpeg=' docker run-v $ outpath 3360/root/download jrottenberg/ffmpeg 3360 latest ';$ cmd=' nohup $ ffmpeg-I { $ inPath }/{ $ name }-HLS _ time 10-HLS _ list _ size 0-f HLS-r 25 { $ inPath }/{ $ fileName }/index . m3u 8。/code . log ';系统($ cmd);//延迟执行跳转返回URL($ fileName);函数getFileName($ filename){ $ houzhui=substr(strchr($ filename,')), 1);$result=basename($filename,'.'。$ Hou zhui);返回$ result} function return URL($ filename){ echo ' a class=' BTN BTN-视频BTN-LG' href='。/static/{ $ filename }/index . m3u 8 ' h1正在处理中.点击跳转/h1/a ';死去;}在上面的代码中,考虑文件是否已经转码,如果已经转码,直接返回播放地址,否则创建一个存放TS文件的文件夹,然后进行转码。转码时,使用nohup命令让FFmpeg异步执行,然后PHP返回播放地址。

动词(verb的缩写)检验和测试

通过前面的步骤,作者完全搭建了一套流媒体服务器。下面将测试这些服务能否正常运行,包括视频列表显示、视频转码和转码后的视频播放

5.1视频列表

首先,通过浏览器打开网址,如下所示

http://localhost:8089/加载后,可以看到以下视频列表

如果读者对上面的代码运行界面略有不同,因为作者为了节省文章空间,没有把风格代码放入文章中,如果想要一个好看的界面,可以自己写风格代码。

5.2视频转码

点击视频列表中的链接后,后台PHP程序会执行转码任务,然后返回链接地址,如下图所示

这时候就意味着FFmpeg已经在后台运行了。您可以通过以下命令检查FFmpeg容器的运行状态。参考命令如下

docker ps返回的参考结果如下

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS name sac3e 7233 eb9f jrottenberg/ffmpeg 3360 latest ' ffmpeg-I/root/Dow…' 1小时前up 1小时keen _ Feynman从上面返回的结果可以看出,当前正在运行一个任务。这时打开视频输出目录,会看到有几个ts格式的视频文件,刚刚被PHP自动执行,如下图所示

当您看到如上所示的转码视频文件时,您可以通过浏览器访问它

5.3视频播放

这里要记住的是,HLS协议是苹果开发的,所以除了苹果浏览器之外的所有浏览器默认都不支持m3u8解析。如果需要使用其他浏览器播放,需要安装插件;不需要苹果的默认支持

作者通过Safari浏览器重新打开页面,然后再次选择jumps视频,然后直接跳转到播放页面,如下图所示

看到这,流媒体的建设基本完成。如果需要播放更多的视频,只需要将视频文件存储在指定的视频目录中,网页就会自动被读取出来。页面可能过于简化,读者可以根据自己的需要美化html页面。

摘要

以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

版权声明:结合PHP和Ffmpeg快速构建流媒体服务的实践记录是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。