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

时间:2010-01-11 16:06:21

标签: php video thumbnails php4

在给定视频文件(.mov.mp4)的PHP中是否有办法生成缩略图图像预览?

4 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:18)

答案 2 :(得分:8)

有两种想法:

  • 使用命令行工具,如流行的ffmpeg,但是你几乎总是需要一个自己的服务器(或一个非常好的服务器管理员/托管公司)才能获得

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

答案 3 :(得分:0)

我推荐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);