解决!上传 mp4 到服务器之后,个别视频无法在浏览器播放
使用 ffmpeg 对视频进行转码,转存后上传七牛云空间,作为视频资源,可在浏览器正常播放
记录一下工作中遇到的问题以及解决方法。
公司站点有些用户需要上传视频资源,文件不大,大多是MP4格式的,但是偶然发现个别视频文件上传之后并不能播放,文件后缀也都是mp4。
查阅相关资料之后,了解到视频的编码格式有多种,但是浏览器一般能识别到的是h264编码的。
最初给产品的建议是在上传入口贴个链接,让用户自行下载转码工具进行转码,但是产品大佬表示多数用户不一定会使用,另外就是用户体验不好。
转而去查阅七牛云的文档,发现七牛提供的有转码服务,迅速莽了一套出来,交给前端调试,最后也通过了。
然鹅,七牛云是要收费!!!
4 分钟的视频转码需要 3 毛钱!
0.03 元 / 4 分钟 还是普通清晰度的!
这么大的开支、这么小的公司,领导当然不会批这个钱。
最终查到了 ffmpeg 这么个东西,看起来能用。
安装 ffmpeg#
1
yum install yasm2
下载 x264,www.videolan.org/developers/x264.ht... 在该页面找到对应的资源链接 直接 wget 下载到服务器.3
下载 ffmpeg ffmpeg.org/download.html 在该页面找到对应的资源链接,直接 wget 下载到服务器.4
tar -xjf x264-master.tar.bz2 注意重命名 x264 在 usr/local/ 下的名称 和下面的配置相对应 并进入 x264 目录5
./configure --prefix=/usr/local/x264 --enable-shared --enable-static --disable-asm
此处prefix对应的路径就是第四步 x264-master.tar.bz2 的解压路径
make
make install6
返回上一级,tar xjf ffmpeg-4.2.3.tar.bz2
注意重命名 ffmpeg 文件夹的名称 和配置命令相对应 cd 进入 ffmpeg7
./configure --prefix=/usr/local/ffmpeg --enable-shared --enable-yasm --enable-libx264 --enable-gpl --enable-pthreads --extra-cflags=-I/usr/local/x264/include --extra-ldflags=-L/usr/local/x264/lib
这里同样要注意 x264 和 ffmpeg 的路径问题
make
make install8
vim /etc/ld.so.conf 在文件末尾加上
/usr/local/ffmpeg/lib/
保存退出 执行 ldconfig9
vim /etc/profile 文件末添加环境变量:
#set ffmpeg environment
PATH=$PATH:/usr/local/ffmpeg/bin
export PATH
保存退出 执行 source /etc/profile
10
查看是否成功 ffmpeg -version
注意:
坑:
bash: ffmpeg: command not found
一个简单粗暴的解决办法: 进入 /usr/local/ffmpeg/bin 目录
找到 ffmpeg 文件,然后复制到 /usr/local/bin 目录下
然后在给这个目录权限,这一步很重要
sudo chmod -R 777 /usr/local/bin
也可直接创建软连接到 usr/local/bin
坑:
ffmpeg: error while loading shared libraries: libx264.so.161: cannot open shared object file: No such file or directory
在 etc/ld.so.conf 下追加
/usr/local/x264/lib/
或者重新编译安装 x264
安装完毕,开始调用#
$cmd = '/usr/local/ffmpeg/ffmpeg -i ' . $file_path . ' -c:v libx264 -strict -2 ' . $new_path;
exec($cmd, $log, $status);
\Log::info('视频转码完成', ['new_path' => $new_path, 'log' => $log, 'status' => $status]);
这里需要注意,虽然 ffmpeg 我们设定了全局变量,在命令行调试的时候是可以成功触发执行的,但是我这里是放到队列里进行调用,发现始终返回 127,最后在 $cmd 这里,带上 ffmpeg 的绝对路径就可以成功了。
另外,由于视频转码过程比较慢,4 分钟的视频,公司的测试服务器转码花了大致 10 分钟,因此转码过程建议都队列处理,在队列设置里注意设置队里任务的 timeout 时长
结语#
第一次发文,非运维大佬,就是个臭敲代码的,如有纰漏欢迎指正,感谢!
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: