【备忘】利用FFMpeg读取视频第一帧作为封面

发布于:2024-04-20 ⋅ 阅读:(27) ⋅ 点赞:(0)

前言

以前做过类似项目,当时是利用php 执行cli命令的方式去读取视频第一帧,现在2024年了服务器环境的升级再使用这种方式也不好了,现在用新的方式去实现这个简单的功能。(有点困了不想写了)

实现步骤

  1. 前提要先安装ffmpeg和ffprobe两个二进制文件扩展,网上有很多安装方法,自行搜索。安装完成之后,使用 find / -name 分别搜索这两个文件:find / -name ffmpeg,find / -name ffprobe 如果扩展安装成功是一定搜得到的。
  2. composer安装php-ffmpeg/php-ffmpeg库,我的版本是
    "php-ffmpeg/php-ffmpeg": "^0.19.0",现在有其它php库支持php8+了,有实力的可以用最新的版本,我这里是php7.4,也不想去搞环境了,麻烦,主要是要出活。
  3. 代码操作,经过测试此代码复制可用
                // 初始化FFMpeg实例,指向FFmpeg可执行文件的路径(根据实际情况调整路径)
                $ffmpeg = FFMpeg::create([
                    'ffmpeg.binaries' => '/usr/bin/ffmpeg',  // 或者其他FFmpeg实际路径,用find / -name 分别搜索
                    'ffprobe.binaries' => '/usr/bin/ffprobe', // 或者其他ffprobe实际路径
                ]);
    
                // 指定要从中提取第一帧的视频文件路径
                $inputVideo = $updata['real_path'];  // 替换为您的视频文件物理路径
    
                // 指定输出图像文件的路径和格式(例如,输出为JPEG格式)
                $filename = Tools::rand_str() . '.jpg';
                $outputImage = 'public/uploads/video_cover/' . $filename;;  // 替换为您希望保存第一帧的物理路径
    
                // 打开视频文件
                $video = $ffmpeg->open($inputVideo);
    
                // 提取第一帧(默认情况下,FFMpeg库将从视频的开始处获取第一帧)
                $frame = $video->frame(TimeCode::fromSeconds(0));
    
                // 将第一帧保存到指定的图像文件
                $frame->save($outputImage, 'image/jpeg');

扩展安装参考:https://www.cnblogs.com/j-jian/p/13542234.html

要在CentOS和RHEL发行版上安装FFmpeg,您需要使用以下命令在系统上启用EPEL和RPM Fusion存储库。

要安装和启用EPEL,请使用以下命令。

# yum install epel-release

要安装和启用RPM Fusion,请在您的分发版本上使用以下命令。

-------------- 在 CentOS 7.x 上-------------- 
# yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://download1.rpmfusion.org/nonfree/el/rpmfusion-nonfree-release-7.noarch.rpm

启用存储库后,运行以下命令安装FFmpeg:

# yum install ffmpeg ffmpeg-devel

# ffmpeg -version

END