项目中需要对上传的视频提取一张图片所谓视频封面,查阅相关资料发现需要使用FFMpeg可以达到目的,并在github上发现了这个项目 PHP-FFMpeg,使用的前提是系统中需要安装 ffmpeg

我用的是centos6,安装步骤如下:

1
2
3
4
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm

yum install ffmpeg ffmpeg-devel -y

安装好后,查阅PHP-FFMpeg的文档,使用composer安装库:

1
composer require php-ffmpeg/php-ffmpeg

安装完成,编写了如下方法来提取封面图片:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
require 'vendor/autoload.php';

function video_thumb($videopath)
{
$ffmpeg = FFMpeg\FFMpeg::create(array(
'ffmpeg.binaries' => '/usr/bin/ffmpeg',
'ffprobe.binaries' => '/usr/bin/ffprobe',
'timeout' => 3600,
'ffmpeg.threads' => 12,
));

$video = $ffmpeg->open($videopath);

// 提取视频第一秒画面
$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(1));

// 期望得到的是二进制图片
return $frame->save('', false, true);
}

此处发现了一个坑,src\FFMpeg\Media\Frame.phpsave方法中,第三个参数$returnBase64设置为true即表示返回二进制图片数据,但此处并没有按预期返回,并且还报出了一个Fatal error:

1
Fatal error: Uncaught Alchemy\BinaryDriver\Exception\ExecutionFailureException: ffmpeg failed to execute command '/usr/bin/ffmpeg' '-y' '-ss' '00:00:01.00' '-i' '/tmp/phphUFOiO' '-vframes' '1' '-f' 'image2pipe' '-' '' in /www/path/vendor/php-ffmpeg/php-ffmpeg/src/FFMpeg/Media/Frame.php on line 134

查阅PHP-FFMpeg源码发现 src\FFMpeg\Media\Frame.php的119行可能有问题,当需要返回二进制数据时,就不需要设置输出文件名了,所以这里缺少判断,改为:

1
2
3
if(!$returnBase64) {
$commands = array_merge($commands, array($pathfile));
}

成功啦!

参考:

1
2
https://www.cnblogs.com/wpjamer/p/ffmpeg.html
https://github.com/PHP-FFMpeg/PHP-FFMpeg