从视频文件生成预览图片?

52

在PHP中,是否有一种方法可以生成视频文件(.mov.mp4)的缩略图预览?


1
@FrankFarmer 那个链接没有返回结果,因为“缩略图”标签无效。 - starbeamrainbowlabs
3个回答

57

解决方案#1(旧版)(不建议使用)

首先安装ffmpeg-php项目 (http://ffmpeg-php.sourceforge.net/)

然后您可以使用此简单代码:

<?php
$frame = 10;
$movie = 'test.mp4';
$thumbnail = 'thumbnail.png';

$mov = new ffmpeg_movie($movie);
$frame = $mov->getFrame($frame);
if ($frame) {
    $gd_image = $frame->toGDImage();
    if ($gd_image) {
        imagepng($gd_image, $thumbnail);
        imagedestroy($gd_image);
        echo '<img src="'.$thumbnail.'">';
    }
}
?>

描述: 这个项目使用二进制扩展名为.so的文件,非常老,最后更新时间是2008年。所以,可能无法与更新版本的FFMpegPHP兼容。


解决方案#2 (更新于2018) (推荐)

首先安装PHP-FFMpeg项目 (https://github.com/PHP-FFMpeg/PHP-FFMpeg)
(只需运行以下命令进行安装:composer require php-ffmpeg/php-ffmpeg)

然后您可以使用这个简单的代码:

<?php
require 'vendor/autoload.php';

$sec = 10;
$movie = 'test.mp4';
$thumbnail = 'thumbnail.png';

$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open($movie);
$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds($sec));
$frame->save($thumbnail);
echo '<img src="'.$thumbnail.'">';

描述:这是一个更新、更现代的项目,可以与最新版本的FFMpegPHP一起使用。请注意,需要使用proc_open() PHP函数。


4
API已经发生了变化,这个回答需要更新一下 ;) - tobias47n9e
@tobias47n9e 我再次检查了,但旧的URL仍然有效!而且API也没有改变(项目的最后更新是在2008年),无论如何,我添加了新的更好的解决方案。 - Nabi K.A.Z.
请注意:此库需要一个可用的FFMpeg安装。您需要同时拥有FFMpeg和FFProbe二进制文件才能使用它。(我的主机不允许安装自己的二进制文件。) - Sarah Trees
1
@SarahTrees 好的。尝试上传二进制的ffmpeg并使用FFMpeg\FFMpeg::create(array( 'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg', 'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe',进行配置,或许可以解决问题。 - Nabi K.A.Z.
在 https://www.ffmpeg.org/download.html 上可以找到 Windows、Linux、OS X 等平台的二进制文件。 - Sarah Trees
我遇到了这个错误,有人能帮忙吗? 致命错误:在D:\Projects\wamp\www\code_build\PHP-FFMpeg-master\src\FFMpeg\Driver\FFProbeDriver.php的第50行,抛出未捕获的异常'Alchemy\BinaryDriver\Exception\ExecutableNotFoundException',消息为“找不到可执行文件,建议使用:avprobe、ffprobe”。 - Sudharshan Nair

9
我能想到两种方法:
  • 使用命令行工具,比如流行的ffmpeg,但你几乎总是需要自己的服务器(或者一个非常好的服务器管理员/托管公司)来获得它。

  • 使用screenshoot插件为LongTail Video player创建手动截图,然后将其发送到服务器端脚本。


1

我推荐使用 php-ffmpeg 库。

提取图像

您可以使用 FFMpeg\Media\Video::frame 方法在任何时间码提取帧。

此代码返回一个 FFMpeg\Media\Frame 实例,对应于第 42 秒。您可以将任何 FFMpeg\Coordinate\TimeCode 作为参数传递,有关更多信息,请参见下面的专用文档。

$frame = $video->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(42));
$frame->save('image.jpg');

如果您想从视频中提取多个图像,则可以使用以下过滤器:
$video
    ->filters()
    ->extractMultipleFrames(FFMpeg\Filters\Video\ExtractMultipleFramesFilter::FRAMERATE_EVERY_10SEC, '/path/to/destination/folder/')
    ->synchronize();

$video
    ->save(new FFMpeg\Format\Video\X264(), '/path/to/new/file');

默认情况下,这将把帧保存为jpg图像。
您可以使用setFrameFileType覆盖此设置,以另一种格式保存帧:
$frameFileType = 'jpg'; // either 'jpg', 'jpeg' or 'png'
$filter = new ExtractMultipleFramesFilter($frameRate, $destinationFolder);
$filter->setFrameFileType($frameFileType);

$video->addFilter($filter);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接