在PHP中,是否有一种方法可以生成视频文件(.mov
,.mp4
)的缩略图预览?
在PHP中,是否有一种方法可以生成视频文件(.mov
,.mp4
)的缩略图预览?
首先安装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',
进行配置,或许可以解决问题。 - Nabi K.A.Z.致命错误:在D:\Projects\wamp\www\code_build\PHP-FFMpeg-master\src\FFMpeg\Driver\FFProbeDriver.php的第50行,抛出未捕获的异常'Alchemy\BinaryDriver\Exception\ExecutableNotFoundException',消息为“找不到可执行文件,建议使用:avprobe、ffprobe”。
- Sudharshan Nair使用命令行工具,比如流行的ffmpeg,但你几乎总是需要自己的服务器(或者一个非常好的服务器管理员/托管公司)来获得它。
使用screenshoot插件为LongTail Video player创建手动截图,然后将其发送到服务器端脚本。
我推荐使用 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');
setFrameFileType
覆盖此设置,以另一种格式保存帧:$frameFileType = 'jpg'; // either 'jpg', 'jpeg' or 'png'
$filter = new ExtractMultipleFramesFilter($frameRate, $destinationFolder);
$filter->setFrameFileType($frameFileType);
$video->addFilter($filter);