📜  ffmpeg 在 php 中生成缩略图(1)

📅  最后修改于: 2023-12-03 14:41:10.745000             🧑  作者: Mango

用FFmpeg在PHP中生成缩略图

生成缩略图(Thumbnail)是现代网站的常见需求。FFmpeg是一个非常好用的视频处理工具,它可以很容易地将视频转码成不同格式,同时也可以生成缩略图。

本文将介绍如何在PHP中使用FFmpeg生成缩略图的方法。以下是步骤以及相关的代码范例。

安装FFmpeg

在使用FFmpeg之前,需要先安装它。

Windows

如果你是在Windows系统上开发,则需要先下载FFmpeg的可执行文件。你可以在FFmpeg的官方网站(https://ffmpeg.org/)上下载相应的版本。下载完成后,将FFmpeg添加到系统变量PATH中。

Linux

在Linux系统上,可以通过以下命令进行安装:

sudo apt-get install ffmpeg

或者可以使用以下命令安装最新版本:

sudo add-apt-repository ppa:jonathonf/ffmpeg-4
sudo apt-get update
sudo apt-get install ffmpeg
使用FFmpeg生成缩略图

在我们能够生成缩略图之前,我们需要确定我们要生成哪个视频的缩略图以及缩略图的参数。以下是一个使用FFmpeg生成缩略图的基本命令:

ffmpeg -i video.mp4 -ss 00:00:03 -vframes 1 -s 480x300 -f image2 thumb.jpg

这个命令用于从video.mp4文件的第三秒开始截取一张480x300的缩略图。

在PHP中,我们可以使用以下代码通过exec函数执行FFmpeg命令:

$cmd = "ffmpeg -i video.mp4 -ss 00:00:03 -vframes 1 -s 480x300 -f image2 thumb.jpg";
exec($cmd);

以上代码用于在PHP中生成缩略图。其中,“$cmd”变量存放着FFmpeg命令的字符串。当我们运行exec函数时,它会自动执行FFmpeg命令。

生成多个缩略图

有时候,我们需要生成多个缩略图,例如生成一个缩略图的序列。以下是示例代码:

$start = 0;
$duration = 10;
$frameCount = 5;

for($i=1; $i<=$frameCount; $i++){
    $thumbName = "thumb_" . $i . ".jpg";
    $cmd = "ffmpeg -i video.mp4 -ss " . $start . " -vframes 1 -s 480x300 -f image2 " . $thumbName;
    exec($cmd);
    $start += $duration; // 计算下一帧的起始时间
}

以上代码用于生成五个480x300的缩略图,从视频的第1秒、第11秒、21秒、31秒和41秒分别开始。我们同样在命令中使用了-vframes 1参数以便只截取一帧图像。

常见问题及解决方案
1. 无法找到FFmpeg

如果你无法使用exec函数或者指定的FFmpeg路径无法正确找到,则可以使用PHP中的shell_exec函数,如下所示:

$cmd = "/usr/local/bin/ffmpeg -i video.mp4 -ss 00:00:03 -vframes 1 -s 480x300 -f image2 thumb.jpg";
$result = shell_exec($cmd);
2. 生成缩略图的时间很长

如果你需要生成很多的缩略图,那么FFmpeg可能需要花很长时间来生成。这时,我们可以通过更改FFmpeg的参数来加快处理速度。

例如,添加以下参数:

$cmd = "ffmpeg -i video.mp4 -ss 00:00:03 -vframes 1 -s 480x300 -f image2 -qscale:v 10 thumb.jpg";

其中qscale是一个控制图像质量的参数。qscale越小,图像质量越高,文件大小也越大。缺省值为2,而在上面的命令中,我们将其设置为10。这样可以保证高质量图像的同时,减少文件的大小。这个参数的值可以任意设置,视情况而定。

3. 生成的缩略图有黑色边框

有时候,生成的缩略图中会有一些黑色的边框。这是由于FFmpeg的输出比例和缩略图的比例不一致造成的。

我们可以通过添加以下参数来解决这个问题:

$cmd = "ffmpeg -i video.mp4 -ss 00:00:03 -vframes 1 -s 480x360 -aspect 4:3 -vf \"scale=480:trunc(ow/a/2)*2\" -f image2 thumb.jpg";

其中,aspect参数用于指定输出的比例,而vf参数则用于缩放图像。这样可以确保输出的图像比例和缩略图比例一致。如果你需要生成其他大小的缩略图,可以根据需要修改这些参数。

结论

FFmpeg是一个功能强大的视频处理工具,可以用来生成高质量的缩略图。在PHP中,我们可以使用exec函数或者shell_exec函数来执行FFmpeg命令。此外,我们还需要注意生成缩略图的高效方法,避免长时间等待和使用大量的计算资源。