PHP使用FFmpeg获取视频封面图

最近又使用了一种新的方式;
之前可能使用到的方式getID3获取视频音频等信息;
今天说的是通过ffmpeg软件;
获取图片信息 封面图,时长,大小 加水印等;

其实实现起来也比较简单;
只需要三步;
1.安装ffmpeg软件(win系统都有对应的安装包,支持linux的);
2.PHP中composer安装php-ffmpeg库;
3.通过代码去调用就可以啦;

第一步:安装ffmpeg软件;
官网提供的下载地址 ffmpeg下载地址
个人博客提供下载地址 ffmpeg下载地址

下载解压;
进入bin目录;
就可以看到如下图的文件;
.exe文件

下载完成之后;
我们可以添加到环境变量(也可以不添加,我们就要使用绝对路径啦)里面去;
运行ffmpeg我们可以看见如下界面;
就说明我们安装成功啦(╥╯^╰╥);
运行ffmpeg
OK , 第一步我们已经完成;

第二步:安装php-ffmpeg库

composer require php-ffmpeg/php-ffmpeg

packagist介绍了很多种用法;
还有github上面也有介绍;

下载成功之后集成到项目中就可以使用啦;

第三步:通过代码去调用
获取视频的宽,高,时长,大小与封面图;

<?php

namespace App\Models\Video;

use FFMpeg\Coordinate\TimeCode;
use FFMpeg\FFProbe;
use FFMpeg\FFMpeg as FFMpegTool;
use Illuminate\Support\Facades\Log;

class Ffmpeg
{
    /**
     * @param $file
     * @return array
     * @author shidatuo
     * @description 获取视频的宽、高、时长、大小
     */
    public static function getWithHeightTime($file)
    {
        $config = [
            'ffmpeg.binaries'  => env('FFM_PEG_PATH'),
            // env里面配置项 FFM_PEG_PATH=D:\ffmpeg\ffmpeg-2020-12-12-git-5148740e79-essentials_build\bin\ffmpeg.exe
            'ffprobe.binaries' => env('FFP_ROBE_PATH'),
            // env里面配置项 FFP_ROBE_PATH=D:\ffmpeg\ffmpeg-2020-12-12-git-5148740e79-essentials_build\bin\ffprobe.exe
            'timeout' => 300
        ];

        Log::info('ffmpeg配置信息',[$config]);

        $ff = FFProbe::create($config);
        $times = $ff->format($file)
        ->get('duration');

        $size = $ff->format($file)
        ->get('size');

        $peg = \FFMpeg\FFMpeg::create($config);
        $dimension = $peg->getFFProbe()
            ->streams($file)
            ->videos()
            ->first()
            ->getDimensions();

        $height = $dimension->getHeight();
        $width  = $dimension->getWidth();

        Log::info('ffmpeg 获取时长信息',[$times]);
        Log::info('ffmpeg 获取大小信息',[$size]);
        Log::info('ffmpeg 获取高信息',[$height]);
        Log::info('ffmpeg 获取宽信息',[$width]);

        return compact('times','size','height','width');

    }

    /**
     * @param $url
     * @return array|bool
     * @author shidatuo
     * @description 获取视频封面
     */
    public static function getVideoCover($url)
    {
        // 程序安装目录,不加可能会无法运行
        $ff = FFMpegTool::create([
            'ffmpeg.binaries'  => env('FFM_PEG_PATH'),
            // env里面配置项 FFM_PEG_PATH=D:\ffmpeg\ffmpeg-2020-12-12-git-5148740e79-essentials_build\bin\ffmpeg.exe
            'ffprobe.binaries' => env('FFP_ROBE_PATH'),
            // env里面配置项 FFP_ROBE_PATH=D:\ffmpeg\ffmpeg-2020-12-12-git-5148740e79-essentials_build\bin\ffprobe.exe
            'timeout' => 300
        ]);
        // 打开文件资源
        $video = $ff->open($url);
        // 文件名称
        $file_name = md5(uniqid() . time()) . '.jpg';
        // 是否存在目录
        $path = date('Ym').'/'.date('d') .'/';
        // 是否存在该目录 , 不存在创建目录
        if (!is_dir($path))
            mkdir($path, 0755, true);
        // 生成文件的绝对路径
        $file_path = $path . $file_name;
        // 获取封面图
        $video->frame(TimeCode::fromSeconds(2))->save($file_path);
        // 返回数据
        return compact('file_path');
    }

}

linux系统下是也是一样的;
只是ffmpeg执行路径不一样;
哈哈哈 , 就是这么简单;
睡觉啦;
(╥╯^╰╥)

史大坨博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论