Есть ли способ PHP для видеофайла (.mov
, .mp4
) для создания предварительного просмотра эскизов?
Создать изображение предварительного просмотра из видеофайла?
Ответ 1
Посмотрите http://ffmpeg.org/ вместе с этим обсуждением http://board.phpbuilder.com/showthread.php?10327812-How-to-install-ffmpeg-php-to-create-thumbnails-from-videos
Ответ 2
Решение № 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 году. Так что, возможно, не работает с более новой версией FFMpeg
или PHP
.
Решение № 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.'">';
Описание: Это более новый и более современный проект и работает с последней версией FFMpeg
и PHP
. Обратите внимание, что это требуется для PHP-функции proc_open()
.
Ответ 3
Приходят на ум два способа:
-
Используя инструмент командной строки, такой как популярный ffmpeg, вам почти всегда понадобится собственный сервер (или очень хороший сервер/хостинг-компания), чтобы получить это
-
Используя плагин screenshoot "для LongTail Video Player, который позволяет создавать ручные скриншоты, которые затем отправляются на сервер script.
Ответ 4
Попробуйте с ffprobe
который устанавливается самостоятельно при установке ffmpeg
function get_video_attributes($video,$ffprobe) {
$command = "$ffprobe $video 2>&1";
$output = shell_exec($command);
$regex_sizes = "/Video: ([^,]*), (.*), ([0-9]{1,4})x([0-9]{1,4}), ([0-9]{1,4}) kb\/s/";
if (preg_match($regex_sizes, $output, $regs)) {
$v_codec = $regs[1] ? $regs[1] : null;
$width = $regs[3] ? $regs[3] : null;
$height = $regs[4] ? $regs[4] : null;
$v_bps = $regs[5] ? $regs[5] : null;
}
$regex_sizes = "/Audio: ([^,]*), ([^,]*) Hz, (.*), ([0-9]{1,4}) kb\/s/";
if (preg_match($regex_sizes, $output, $regs)) {
$a_codec = $regs[1] ? $regs[1] : null;
$hz = $regs[2] ? $regs[2] : null;
$a_bps = $regs[4] ? $regs[4] : null;
}
$regex_duration = "/Duration: ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2}).([0-9]{1,2}), (.*) ([0-9]{1,4}) kb\/s/";
if (preg_match($regex_duration, $output, $regs)) {
$hours = $regs[1] ? $regs[1] : null;
$mins = $regs[2] ? $regs[2] : null;
$secs = $regs[3] ? $regs[3] : null;
$ms = $regs[4] ? $regs[4] : null;
$bps = $regs[6] ? $regs[6] : null;
}
return array(
'width' => $width ? $width : null,
'height' => $height ? $height : null,
'hours' => $hours ? $hours : null,
'mins' => $mins ? $mins : null,
'secs' => $secs ? $secs : null,
'ms' => $ms ? $ms : null,
'hz' => $hz ? $hz : null,
'v_codec' => $v_codec ? $v_codec : null,
'a_codec' => $a_codec ? $a_codec : null,
'bps' => $bps ? $bps : null,
'v_bps' => $v_bps ? $v_bps : null,
'a_bps' => $a_bps ? $a_bps : null
);
}