Изображения ffmpeg к видео с разным временем начала и продолжительностью - PullRequest
0 голосов
/ 26 апреля 2018

Я недавно узнал о существовании FFMPEG и пытаюсь использовать его на своем WordPress-сайте.

На сайте я работаю над страницей формы html / php / js, которая позволяет пользователям загружать изображения и устанавливать, когда изображение отображается и как долго.

Сейчас у меня есть код, который показывает только одно изображение для всего видео.

<?php if (isset($_POST['button'])) { 
echo shell_exec('ffmpeg -t '.$cap_1.' -i /myurl/beach-1866431.jpg -t '.$cap_2.' -i /myurl/orlando-1104481-1.jpg -filter_complex "scale=1280:-2" -i /myurl/audio.mp3 -c:v libx264 -pix_fmt yuv420p -t 30 -y /myurl/'.$v_title.'.mp4 2>&1');
 } ?>

Я попытался установить "-t" для продолжительности с моими переменными php, но ничего не изменилось, и я не могу понять, что использовать для времени начала каждого изображения.

Кроме того, при написании команд shell_exec вместо того, чтобы все они были в одной строке, есть ли способ написать рабочий код команды в php-файлах с переносами строк? Например -

 <?php if (isset($_POST['button'])) { 
    echo shell_exec('ffmpeg -t '.$cap_1.' -i /myurl/beach-1866431.jpg 
    -t '.$cap_2.' -i /myurl/orlando-1104481-1.jpg 
    -filter_complex "scale=1280:-2" 
    -i /myurl/audio.mp3 
    -c:v libx264 -pix_fmt yuv420p -t 30 -y /myurl/'.$v_title.'.mp4 2>&1');
         } ?>

EDIT

Пока что текстовый файл concat работает, однако я не знаю, как установить время начала для каждого изображения ---

ffconcat version 1.0
file /path/beach-1866431.jpg
duration 3
file /path/orlando-1104481-1.jpg
duration 5
file /path/beach-1866431.jpg

И команда ffmpeg -

shell_exec('ffmpeg -f concat -safe 0 -i /path/file.txt -filter_complex "scale=1280:-2" -i /path/audio.mp3 -c:v libx264 -pix_fmt yuv420p -t 30 -y /path/'.$v_title.'.mp4 2>&1');

РЕДАКТИРОВАТЬ 2

Используя предложенный метод concat, мой код теперь выглядит так -

<?php if (isset($_POST['button'])) { 
echo shell_exec('ffmpeg \
-loop 1 -framerate 24 -t 10 -i goldmetal.jpg \
-i 3251.mp3 \
-loop 1 -framerate 24 -t 10 -i cash-register-1885558.jpg \
-loop 1 -framerate 24 -t 10 -i ice-1915849.jpg \
-filter_complex "[0:v][1:a][2:v][3:v]concat=n=4:v=1:a=1[v][a]" -map "[v]" -map "[a]" -c:v libx264 /path/'.$v_title.'.mp4 2>&1');
 } ?>

Но я получаю эту ошибку -

**Stream specifier ':v' in filtergraph description [0:v][1:a][2:v][3:v]concat=n=4:v=1:a=1[v][a] matches no streams.**

РЕДАКТИРОВАТЬ 3

Я почти все заработал, используя две команды: одну для изображений и затемнения, другую для объединения звука. Единственная проблема, с которой я столкнулся, - это изменение времени появления каждого изображения. -

echo shell_exec('ffmpeg \
-loop 1 -t 5 -i '.$thepath .'/'.$v_pix1.' \
-loop 1 -t 5 -i ' .$thepath . '/cash-register-1885558.jpg \
-loop 1 -t 5 -i ' .$thepath . '/ice-1915849.jpg \
-loop 1 -t 5 -i '.$thepath .'/'.$v_pix1.' \
-loop 1 -t 5 -i ' .$thepath . '/ice-1915849.jpg \
-filter_complex \
"[0:v]setpts=PTS-STARTPTS,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v0]; \
 [1:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v1]; \
 [2:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v2]; \
 [3:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v3]; \
 [4:v]setpts=PTS-STARTPTS,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1,scale=1280:720,setdar=16/9,setsar=sar=300/300[v4]; \
 [v0][v1][v2][v3][v4]concat=n=5:v=1:a=0,format=yuv420p[v]" -map "[v]" -y '.$thepath .'/fadeout.mp4 2>&1');


echo shell_exec('ffmpeg \
-i '.$thepath .'/fadeout.mp4 \
-i '.$thepath .'/3251.mp3 \
-filter_complex "[0:v:0][1:a:0] concat=n=1:v=1:a=1 [vout] [aout]" -map "[vout]" -map "[aout]" -c:v libx264 -r 1 -y '.$thepath .'/mergetest.mp4 2>&1');

1 Ответ

0 голосов
/ 03 мая 2018

В этом ответе рассматриваются ffmpeg конкретные вопросы в широком вопросе.

В этом примере будут сняты изображения любого произвольного размера, помещены в окно размером 1280x720, затемнено изображение между изображениями и воспроизведено аудио одновременно. Видео будет заканчиваться всякий раз, когда заканчивается изображение или аудио: в зависимости от того, какое из них самое короткое.

ffmpeg \
-i audio1.mp3 \
-i audio2.wav \
-loop 1 -t 5 -i image1.jpg \
-loop 1 -t 5 -i image2.png \
-loop 1 -t 5 -i image3.jpg \
-filter_complex \
"[2:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=out:st=4:d=1[v1]; \
 [3:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v2]; \
 [4:v]scale=1280:720:force_original_aspect_ratio=decrease,pad=1280:720:(ow-iw)/2:(oh-ih)/2,setsar=1,fade=t=in:st=0:d=1,fade=t=out:st=4:d=1[v3]; \
 [0:a][1:a]amerge=inputs=2[a];
 [v1][v2][v3]concat=n=3:v=1:a=0,format=yuv420p[v]" \
-map "[v]" -map "[a]" -ac 2 -shortest -movflags +faststart output.mp4
...