Для работы с видео на PHP (и не только) можно использовать FFmpeg. Но у этого популярного инструмента есть ограничения. Например, с помощью него очень сложно сделать переходы (transitions) между двумя источниками видео.
Для видео монтажа я рекомендую использовать Melt. Это фреймворк, написанный на C++, но с ним можно так же как и с Ffmpeg работать в терминале, а значит запускать через shell-exec().
Для более удобной работы я написал PHP-класс - PHP Class for video processing.
Несколько примеров:
Создаем экземпляр класса:
$videoProcessing = new Andchir\VideoProcessing(['melt_path' => '/usr/bin/melt']);
Соединение нескольких источников видео:
$videoProcessing ->setProfile('hdv_720_25p') ->addOption(['joinClips' => [ $rootPath . '/uploads/tmp/Social.mp4', $rootPath . '/uploads/tmp/Dog.mp4', $rootPath . '/uploads/tmp/Swans.mp4' ]]) ->setOutputVideoOptions($rootPath . '/uploads/tmp/out1.mp4');
Результат:
Обрезка и соединение видео с переходами:
$videoProcessing ->setProfile('hdv_720_25p') ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/Social.mp4', ['in' => 200, 'out' => 275] ]]) ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/Dog.mp4', ['in' => 50, 'out' => 125] ]]) ->addReadyMadeTransition('fade', 25) ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/Swans.mp4', ['in' => 50, 'out' => 125] ]]) ->addReadyMadeTransition('shiftRightIn', 25, [ 'width' => 1280, 'height' => 720 ]) ->setOutputVideoOptions($rootPath . '/uploads/tmp/out4.mp4');
Результат:
Наложение текста с анимацией:
$videoProcessing ->setProfile('hdv_720_25p') ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/Swans.mp4', ['out' => 120] ]]) ->addTextOverlay('This is my best video', true, [ 'pad' => '50x0', 'size' => 80, 'halign' => 'center', 'valign' => 'top', 'family' => 'Ubuntu', 'slideFrom' => 'bottom', 'duration' => 50, 'inOpacity' => 0, 'outOpacity' => 100 ]) ->setOutputVideoOptions($rootPath . '/uploads/tmp/out11.mp4');
Результат:
Слайдшоу из статичных картинок:
$videoProcessing ->setProfile('hdv_720_25p') ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/picture1.jpg', ['out' => 100] ]]) ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/picture2.jpg', ['out' => 100] ]]) ->addReadyMadeTransition('wipeIn', 25, [ 'wipeName' => 'cloud.pgm' ]) ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/picture3.jpg', ['out' => 100] ]]) ->addReadyMadeTransition('wipeIn', 25, [ 'wipeName' => 'burst.pgm' ]) ->addOption(['inputSource' => [ $rootPath . '/uploads/tmp/picture4.jpg', ['out' => 100] ]]) ->addReadyMadeTransition('wipeIn', 25, [ 'wipeName' => 'radial-bars.pgm' ]) ->addBackgroundAudio($rootPath . '/uploads/tmp/Reformat.mp3', ['out' => 100 * 4 - (24 * 3)]) ->addOption(['filter' => [ 'volume', ['gain' => 1, 'end' => 0], ['in' => 200, 'out' => 100 * 4 - (24 * 3)] ]]) ->setOutputVideoOptions($rootPath . '/uploads/tmp/out12.mp4');
Результат:
Запуск рендерига в фоновом режиме:
$progressLogPath = $videoProcessing->render();
Получение процентов выполнения рендеринга:
// Опциональные параметры: путь лог файла, PID процесса // Иначе берутся из сессии $percent = $videoProcessing->getRenderingPercent();
Поддерживаются профили: hdv_720_25p (1280x720), hdv_1080_25p (1440x1080), dv_pal (720x576), dv_pal_wide (720x576 16/9).
Больше примеров здесь: http://wdevblog.net.ru/video_processing_class/example.php.
Купить PHP класс: https://codecanyon.net/item/php-class-for-video-processing/22631954