PHP中用ffmpeg获取视频封面图片详细步骤
一、环境准备
官网下载:https://ffmpeg.org/download.html
wget https://ffmpeg.org/releases/ffmpeg-4.2.3.tar.bz2
bzip2 -d ffmpeg-4.2.3.tar.bz2
tar -xvf ffmpeg-4.2.3.tar
cd ffmpeg-4.2.3
安装
./configure --prefix=/usr/local/ffmpeg
如果错误提示:
nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
If you think configure made a mistake, make sure you are using the latest
version from Git. If the latest version fails, report the problem to the
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
Include the log file "ffbuild/config.log" produced by configure as this will help
solve the problem.
安装一下 yasm既可:
yum install yasm
也可以编译安装 yasm:
wget http://www.tortall.net/projects/yasm/releases/yasm-1.2.0.tar.gz
tar -xzvf yasm-1.2.0.tar.gz
./configure
make
make install
再执行 configure 命令就可以了,接下来
make
sudo make install
查看是否安装成功
/usr/local/ffmpeg/bin/ffmpeg -version
亦可以配置环境变量(略),不配置就带完整路径使用
二、代码实战
方式1:直接用PHP调用命令
<?php
namespace extend\utils;
class Video
{
static function getVideoCover($file,$name,$time=1) {
$strlenstrlen = strlen($file);
// $videoCover = substr($file,0,$strlen-4);
// $videoCoverName = $videoCover..jpg;//缩略图命名
//exec("ffmpeg -i ".$file." -y -f mjpeg -ss ".$time." -t 0.001 -s 320x240 ".$name."",$out,$status);
$str = config_item('ffmpeg')."ffmpeg -i {$file} -y -f mjpeg -ss 3 -t {$time} {$name}";
system($str);
}
function getTime($file){
$vtime = exec( $str = config_item('ffmpeg')."ffmpeg -i ".$file." 2>&1 | grep Duration | cut -d -f 4 | sed s/,//");//CuPlayer.com提示总长度
$ctime = date("Y-m-d H:i:s",filectime($file));//创建时间
//$duration = explode(":",$time);
// $duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]);//CuPlayer.com提示转化为秒
return [
'video_time'=>$vtime,
'create_time'=>$ctime
];
}
}
方式2:使用composer 引入 php-ffmpeg扩展
composer require php-ffmpeg/php-ffmpeg
安装后,在自己使用的控制器里引入
use FFMpeg\FFMpeg;
use FFMpeg\Coordinate\TimeCode;
使用代码
$ffmpeg = FFMpeg::create(array(
'ffmpeg.binaries' => '/usr/local/ffmpeg/bin/ffmpeg',//服务器ffmpeg安装路径下的文件
'ffprobe.binaries' => '/usr/local/ffmpeg/bin/ffprobe'//服务器ffmpeg安装路径下的文件
));
$videoname = config('kj_url')."/uploads/video/".$info->getSaveName();//视频地址
$video = $ffmpeg->open($videoname);
$frame = $video->frame(TimeCode::fromSeconds(1));//获取第几帧
$filename = time().".jpg";//获取图片命名
$frame->save($filename);//获取图片
$dirname = date("Ymd");//设置日期文件夹
if (!is_dir("uploads/video/img/$dirname")){//是否已有文件夹
mkdir("uploads/video/img/$dirname");//没有则新建文件夹
}
copy($filename,"uploads/video/img/$dirname/$filename"); //拷贝到新目录
unlink($filename); //删除旧目录下的文件
方式3:PHP 安装 php-ffmpeg扩展
首先先下载扩展包
wget http://nchc.dl.sourceforge.net/project/ffmpeg-php/ffmpeg-php/0.6.0/ffmpeg-php-0.6.0.tbz2
进入 ffmpeg-php目录 进行编译扩展
cd ffmpeg-php-0.6.0
/www/server/php/56/bin/phpize
./configure --with-php-config=/www/server/php/56/bin/php-config --enable-skip-gd-check
make
make install
在php.ini中加入extension=ffmpeg.so
重启php-fpm 或者 apache,查看PHPinfo
代码应用:
function createVideoThumb($fileName,$dir,$file = null){
$movie = new ffmpeg_movie($dir.'/'.$fileName);//这里就是视频的存储路径
$ff_frame = $movie->getFrame(1);
$gd_image = $ff_frame->toGDImage();
$filenames =substr($fileName,0,strrpos($fileName,'.'));
$img="./upload/".$filenames."_video.jpg";//存图片的路径
imagejpeg($gd_image, $img);
imagedestroy($gd_image);
}
三、总结
这三种方式,建议用第3种,再是第2种,最后是第1种,因为第一种某些视频在同样的格式下获取不到封面图,第二种composer引入的依赖太多,尤其是引入了symfony的东西,虽然没影响,感觉不是很优雅。