LINUX.ORG.RU

ffmpeg нелогично хочет файлы запортить, вразумите где я ошибся

 


0

1

Имею набор png, нужно создать mp4, желательно задав длительность каждого кадра (delay) в секундах или миллисекундах, видео неспешное.

Пишу такую команду:

ffmpeg -r 25 -i *.png -canvas_size 1920x1080 -vcodec libx264 out.mp4 

и на первом же файле получаю вот такое предложение, которое естественно отвергаю (только вывод ниже был от команды без -canvas_size)

Input #0, png_pipe, from '1633444519779.png':                                                                                                                                                        
  Duration: N/A, bitrate: N/A                                                                                                                                                                                     
    Stream #0:0: Video: png, rgba(pc), 1904x304, 25 tbr, 25 tbn, 25 tbc                                                                                                                                           
File '1633444522758.png' already exists. Overwrite ? [y/N]    

Зачем он пытается переписать исходники? Есть опция -y , накой она нужна не понятно, кому пришло в голову пререписывать исходники, но с ней работает. Время создания исходников становится новым. Мне такого бреда не надо. Как бы его заставить работать по человечески?

Второй вопрос. Как задать ему длительность кадров?

Почему то не принимает опцию -canvas_size 1920x1080 Да, мои файлы немного меньше, и они могут быть разной высоты и ширины, и я хочу чтобы они все были в рамках -canvas_size 1920x1080, от левого верхнего угла. Остальное поле может быть белым или прозрачным. convert так работает.



Последнее исправление: Vahmurka (всего исправлений: 5)

ffmpeg -r 25 -i *.png -canvas_size 1920x1080 -vcodec libx264 out.mp4

*.png раскрывается в список файлов, подходящих маске, ещё до вызова ffmpeg. Например, если у тебя в директории были файлы img01.png, img02.png и img03.png, команда раскроется в

ffmpeg -r 25 -i img01.png img02.png img03.png -canvas_size 1920x1080 -vcodec libx264 out.mp4

Ты сказал писать результат в img02.png, вот ffmpeg и пытается писать в img02.png.

Если входные файлы пронумерованы подряд, то можно имя указать вот так: img%02d.png. Если файлы именованы как попало, стоит грянуть на concat: https://ffmpeg.org/ffmpeg-formats.html#concat. Там можно имена списком в файле указывать.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Где я сказал писать результат в эти файлы?

Опция -i указывет на входные файлы А выходной файл out.mp4, куда пишется сжатое видео, в конце команды. Так по спецификации

Vahmurka
() автор топика
Ответ на: комментарий от Vahmurka

Где я сказал писать результат в эти файлы?

Вот тут: -i *.png

i-rinat ★★★★★
()
Ответ на: комментарий от Vahmurka

Я раньше никогда не указывал больше одного выходного файла, но судя по документации, ffmpeg умеет выводить в больше, чем один файл за раз.

Кстати, первый не должен был переписывать.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от Vahmurka

Из нелпа usage: ffmpeg [options] [[infile options] -i infile]… {[outfile options] outfile}…

всю жисть, везде в линуксе, infile это входные, т.е исходники, а outfile выходные, т.е. результат.

Vahmurka
() автор топика
Ответ на: комментарий от Vahmurka

Читай ВНИМАТЕЛЬНО первое сообщение в теме

goingUp ★★★★★
()
Ответ на: комментарий от Vahmurka

Окей, кажется, я недостаточно объяснил, как оболочка работает.

Как думаешь, что должна напечатать команда echo *.png?

i-rinat ★★★★★
()
ffmpeg -r 25 *.png -canvas_size 1920x1080 -i -vcodec libx264 out.mp4 
anonymous
()
Ответ на: комментарий от Vahmurka

ffmpeg -r 25 -i img01.png img02.png img03.png -canvas_size 1920x1080 -vcodec libx264 out.mp4

будет интерпретироваться как

ffmpeg -r 25 -i img01.png -canvas_size 1920x1080 -vcodec libx264 img02.png img03.png out.mp4

если так будет понятнее

goingUp ★★★★★
()
Ответ на: комментарий от Vahmurka

ты по-английски отличаешь единственное число от множественного? где увидел там возможность множество файлов указать с помощью опции -i?

xmikex ★★★★
()
Ответ на: комментарий от goingUp

нет :) не понятнее.

Вы же сами не пробовали… это я точно знаю. Так не должно интерпретироваться по спецификации и по любой здравой логике.

Как Вы думаете, чьи опции -сanvas и -vcodec ? infile, outfile или ничьи?

Попробуйте, поменяйте.

Vahmurka
() автор топика

ffmpeg -r 25 -i *.png -canvas_size 1920x1080 -vcodec libx264 out.mp4

А ежели так?:

ffmpeg -r 25 -i '*.png' -canvas_size 1920x1080 -vcodec libx264 out.mp4 
anonymous
()
Ответ на: комментарий от Vahmurka

Отдохни чуток и перечитай тред. Тут всем очевидно, что ты тупишь. Выше тебе правильно написали по поводу глоббинга и работы ффмпуг с файлами.

Yorween
()
Ответ на: комментарий от anonymous

А ежели так?:

Точнее так:

ffmpeg -pattern_type glob -r 25 -i '*.png' -canvas_size 1920x1080 -vcodec libx264 out.mp4
anonymous
()
Ответ на: комментарий от Vahmurka

ты разве не видишь, что в описании outfile - это не опция, а просто любой параметр после указанного через -i входного файла?

xmikex ★★★★
()
Ответ на: комментарий от xmikex

Спасибо, Помогло! Этот вариант работает и переписывать исходники не требует.

ffmpeg -r 25 -pattern_type glob -i '*.png' -c:v libx264 out.mp4

Теперь, может подскажете, как длительность настроить, а-то я все глаза проглядел. Не вижу в хелпе этого.

Vahmurka
() автор топика

Вантузоид, ухади.

anonymous
()
Ответ на: комментарий от Vahmurka

Должно быть -i перед каждым файлом

-i img01.png -i img02.png -i img03.png out.mp4

Так ffmpeg понимает, где входные, а где выходные, а не указано ли после этого -сanvas и -vcodec, или нет.

-i img01.png img02.png img03.png out.mp4

Это уже совсем другое

goingUp ★★★★★
()
Ответ на: комментарий от Vahmurka

О, я смотрю ты тут самый умный, и решил нас уму-разуму поучить.

i-rinat ★★★★★
()
Ответ на: комментарий от xmikex

Нет не то. Вот правильный вариант

ffmpeg -r 0.33 -pattern_type glob -i '*.png' -c:v libx264 out.mp4 -y

опция -r это тоже что -framerate но для первого вызова, а -framerate для дублирующего.

Обе опции означают fps. Это не гуманно, но да ладно. У меня один кадр в 3 секунды, значит 0.33 c ошибкой округления. Проверил с секундомером в плэере. Меняет кадры через 3 секунды.

Vahmurka
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.