Наш Telegram бот: @htmlweb_bot

Создание постера к 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]));
    }
}
?>

.