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

Posted

技术标签:

【中文标题】从视频文件生成预览图像?【英文标题】:Generate preview image from Video file? 【发布时间】:2011-01-03 19:42:24 【问题描述】:

在给定视频文件(.mov.mp4)的情况下,php 有没有办法生成缩略图预览?

【问题讨论】:

@FrankFarmer 该链接不返回任何结果,因为thumbnail 标记无效。 【参考方案1】:

解决方案 #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函数是必需的。

【讨论】:

API 已更改,此答案需要更新;) @tobias47n9e 我再次检查了一遍,但旧网址运行良好!而且 API 没有改变(项目的最后一次更新是 2008 年)无论如何我添加了新的更好的解决方案。 记住:这个库需要一个有效的 FFMpeg 安装。您将需要 FFMpeg 和 FFProbe 二进制文件才能使用它。 (我的主机不允许安装自己的二进制文件。) @SarahTrees 当然。尝试上传二进制 ffmpeg 并使用 FFMpeg\FFMpeg::create(array( 'ffmpeg.binaries' =&gt; '/opt/local/ffmpeg/bin/ffmpeg', 'ffprobe.binaries' =&gt; '/opt/local/ffmpeg/bin/ffprobe', 进行配置可能有效。 在ffmpeg.org/download.html 上找到的适用于 Windows、Linux、OS X 的二进制文件 ...【参考方案2】:

想到两种方法:

使用像流行的ffmpeg 这样的命令行工具,但是您几乎总是需要一个自己的服务器(或非常好的服务器管理员/托管公司)来获得它

使用LongTail Video player 的“screenshoot”插件,允许创建手动屏幕截图,然后发送到服务器端脚本。

【讨论】:

【参考方案3】:

我推荐php-ffmpeg图书馆。

提取图像

您可以使用 FFMpeg\Media\Video::frame 方法。

此代码返回一个FFMpeg\Media\Frame 实例,对应于 second 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);

【讨论】:

以上是关于从视频文件生成预览图像?的主要内容,如果未能解决你的问题,请参考以下文章

使用与生成的视频文件不同的预览大小录制视频

如何在没有后端的网站上预览本地视频文件? [复制]

如何在网站上预览用户想要上传的视频文件(PHP、FiileAPI JS)

HTML5 从图像生成视频

在 HTML5 视频标签上生成随机预览图像

从 YouTube 视频预览