【发布时间】:2011-01-03 19:42:24
【问题描述】:
在给定视频文件(.mov、.mp4)的情况下,PHP 有没有办法生成缩略图预览?
【问题讨论】:
-
@FrankFarmer 该链接不返回任何结果,因为
thumbnail标记无效。
标签: php video thumbnails php4
在给定视频文件(.mov、.mp4)的情况下,PHP 有没有办法生成缩略图预览?
【问题讨论】:
thumbnail 标记无效。
标签: php video thumbnails php4
首先安装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 年。所以,可能不适用于FFMpeg 或PHP 的较新版本.
首先安装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.'">';
描述:这是一个更新、更现代的项目,适用于最新版本的FFMpeg 和PHP。注意proc_open()PHP函数是必需的。
【讨论】:
FFMpeg\FFMpeg::create(array( 'ffmpeg.binaries' => '/opt/local/ffmpeg/bin/ffmpeg', 'ffprobe.binaries' => '/opt/local/ffmpeg/bin/ffprobe', 进行配置可能有效。
想到两种方法:
使用像流行的ffmpeg 这样的命令行工具,但是您几乎总是需要一个自己的服务器(或非常好的服务器管理员/托管公司)来获得它
使用LongTail Video player 的“screenshoot”插件,允许创建手动屏幕截图,然后发送到服务器端脚本。
【讨论】:
我推荐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);
【讨论】: