Как прокрутить изображение по вертикали с помощью ffmpeg и одновременно определить конец изображения (EOI)? - PullRequest
0 голосов
/ 24 мая 2019

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

Ответы [ 2 ]

1 голос
/ 25 мая 2019

Чтобы сделать это в одной команде, используйте

ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -t 0.08 -i "input.png" -filter_complex "[1:v]scale=1920:-2,setpts=if(eq(N,0),0,1+1/0.02/TB),fps=25[fg]; [0:v][fg]overlay=y=-'t*h*0.02':eof_action=endall[v]" -map "[v]" output.mp4

Для оболочки Bash используйте эту команду (т.е. экранируйте запятую);

ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -t 0.08 -i "input.png" -filter_complex "[1:v]scale=1920:-2,setpts=if(eq(N\,0)\,0\,1+1/0.02/TB),fps=25[fg]; [0:v][fg]overlay=y=-'t*h*0.02':eof_action=endall[v]" -map "[v]" output.mp4

Для изображения добавляется -t, поэтому у нас есть поток с 2 кадрами.(25 fps x 0.08 = 2).Setpts устанавливает метку времени для 2-го кадра равной скорости прокрутки, которая представляет собой долю высоты.Фильтр fps записывает в промежутки времени метки с клонированными кадрами.

Наложению предписано остановиться после завершения ввода изображения.

0 голосов
/ 24 мая 2019

Вот решение, которое я нашел;

ffmpeg -f lavfi -i color=s=1920x1080 -loop 1 -i "input.png" -filter_complex "[1:v]scale=1920:-2[fg]; [0:v][fg]overlay=y=-'t*h*0.02'[v]" -map "[v]" -t 00:03:00 output.mp4

Обратите внимание, что скорость прокрутки составляет 0,02. Установите его ниже, например 0,01, чтобы прокрутить медленнее, или выше, например, 0,03, чтобы прокрутить быстрее.

Обратите внимание, что я передал команде максимум 3 минуты. На этот раз, к сожалению, он должен быть больше, чем любой вывод с прокруткой изображения, который когда-либо мог бы занять ваша конкретная установка.

Для справки, изображение 1920x7043 пикселей занимает 49,88 секунды. Вы можете получить высоту изображения программно, используя;

file input.png | sed 's|.*1920 x \([0-9]\+\).*|\1|'
output: 7043

Если у кого-то есть лучший способ «определения конца прокрутки изображения - то есть последней строки / нижней части изображения, прокручиваемой от верхней части экрана» и возможность масштабировать время / продолжительность на основе этого - тогда это было бы очень удобно.

На данный момент это лучшее решение, которое у меня есть; просканируйте вывод последней команды ffmpeg, чтобы найти что-то вроде;

[blackdetect @ 0x559298835480] black_start:49.88

Например, используя эту команду;

ffmpeg -i output.mp4 -vf blackdetect=d=0.1:pix_th=.1 -f rawvideo -y /dev/null 2>&1 | grep -o "black_start:[\.0-9]\+ "
output: black_start:49.88

И урожай соответственно;

ffmpeg -i output.mp4 -t 49.88 -c copy finaloutput.mp4
vlc finaloutput.mp4  # Assuming you have vlc installed
...