07.10.2018     95

Для работы с видео на 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