Создание постера к video на php с использованием ffmpeg
Установка ffmpeg на современный unix-сервер
Для начала нужно установить ffmpeg на ваш сервер, если он не установлен. Для этого используем репозтарий dnf. Если у вас yum, то во всех командах замените dnf на yum:Обновляем старые пакеты, чтобы не было конфликтов:
dnf upgrade --refreshВключить репозитории EPEL и RPM Fusion:
dnf install epel-release -y — включить репозиторий EPEL.Включить репозиторий RPM Fusion
dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm -yУстановить FFmpeg и пакеты для его разработки:
dnf install ffmpeg ffmpeg-devel -y
Захват кадра из видео и сохранение в картинку на PHP
<?php
if(!empty($_FILES['video'])) { // получаем видеофайл из переменной с именем video
$typeFile = explode('/', $_FILES['video']['type']); // определяем тип файла по его расширению
if (empty($typeFile[1]) || !in_array($typeFile[1], ['webm', 'mp4'])) die(json_encode(['result' => 'ERROR', 'data' => 'Неверный формат файла ' . $_FILES['video']['type']]));
$fil = date('ymdHi') . '.' . $typeFile[1];
$path = '/video/';
$src = $path . $fil;
$uploadFile = $_SERVER['DOCUMENT_ROOT'] . $src;
if (move_uploaded_file($_FILES['video']['tmp_name'], $uploadFile)) {
// если передано описание файла, сохраним его
if (!empty($_REQUEST['description']) ) file_put_contents($_SERVER['DOCUMENT_ROOT'] . $path . 'Descript.ion',
"\n" . $fil . ' ' . trim($_REQUEST['description']), FILE_APPEND);
// создаем poster для видео ролика
$thumbnail = strtok($fil, '.') . '.jpg';
// захватываем кадр с 5ой секнды видео и сохраняем в файл с таким же именем и расширением jpg
// scale=320:-1 - разрешение устанавливаем 320 - ширина, высота - как получится
// '>>' и '2>&1' в командной строке -> и все сообщения от ffmpeg пишем в файл video.log
// '&' в конце строки - говорит системе не дожидаться выполнения команды и продолжить работу
$exe = "ffmpeg -i $uploadFile -ss 00:00:05 -vframes 1 -vf scale=320:-1 " . $_SERVER['DOCUMENT_ROOT'] . $path . $thumbnail .
' >>' . $_SERVER['DOCUMENT_ROOT'] . $path. 'video.log' . ' 2>&1 &';
$res = system($exe);
if ($res === false) die(json_encode(['result' => 'ERROR', 'data' => 'Не смог создать постер к видео']));
die(json_encode(['result' => 'OK', 'data' => $fil, 'poster' => $thumbnail]));
}
}
?>
.
Прокомментировать/Отблагодарить