PHP中用ffmpeg获取视频封面图片详细步骤

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的东西,虽然没影响,感觉不是很优雅。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值