Как заставить FFMPEG объединять непоследовательные файлы изображений? (пропустить на 3 с)


27

У меня есть куча изображений, которые следуют этому шаблону.

0001.png
0004.png
0007.png
0010.png
0013.png
0016.png
0019.png
...

Они в правильном порядке, но FFMPEG игнорирует что-либо после первого файла, потому что не может найти 0002.png. Как я могу заставить его присоединиться к этим файлам?

Я пытался

ffmpeg -i %04d.png out.avi

2
Как насчет временно переименовать их, сделать AVI, а затем переименовать их обратно в схему (3x-2) .png? Утилита массового переименования @ bulkrenameutility.co.uk/Main_Intro.php - это бесплатное массовое переименование.
Гьян

Ответы:


18

с ffmpeg 0.11.1 это так же просто, как:

ffmpeg -f image2 -i %*.png out.avi

Со manстраницы, в примере в разделе «Преобразование формата видео и аудио файлов»:

При импорте последовательности изображений -iтакже поддерживается внутреннее расширение шаблонных шаблонов (глобирование). Чтобы снизить вероятность вмешательства с реальными именами и расширением Глоба оболочкой, вы должны АКТИВИРУЙТЕ символы Глоба метой предваряя их с одним %характером, как и в foo-%*.jpeg, foo-%?%?%?.jpegили foo-00%[234%]%*.jpeg.

Обновление по комментариям: в последних версиях вы должны использовать -i '*.png'синтаксис.


3
Это не работает для меня, используя ffmpeg или avconv в Ubuntu 13.04
hellocatfood

2
Похоже, это больше не вариант.
Тимммм

2
Тип glob_sequenceшаблона устарел, но globтип шаблона - нет. Ответ Малвьи и Питера Кордеса работает.
доктор Сибрен

1
Pattern type 'glob_sequence' is deprecated: use pattern_type 'glob' instead
Серж

1
Так же, как пояснение, поскольку эта страница в настоящее время является лучшим результатом в Google для этого предупреждающего сообщения ( Pattern type 'glob_sequence' is deprecated...): команда, приведенная выше rymo (в частности, -i %*.png), вызовет предупреждение. Чтобы устранить это, используйте немного другой синтаксис в ответе Питера Кордеса ( -i '*.png').
Джеймс

19

Помимо обходного пути в моем комментарии, вы должны быть в состоянии использовать этот синтаксис из документации ffmpeg :

ffmpeg -f image2 -pattern_type glob -i '*.png' out.avi

Кавычки важны, вам нужен ffmpeg, чтобы увидеть *, а не заставлять его расширять оболочку.


У меня не работает, но, вероятно, потому, что у меня более старая сборка. Я принимаю это, потому что это, скорее всего, поможет будущим пользователям.
Разбойник

Согласно документации ffmpeg вы должны использовать '* .png' вместо% 04d.png с типом шаблона glob.
Друг Георга

Затем будут выбраны все png-файлы, присутствующие в папке, кроме 00xx.png, тогда как OP хочет ставить в очередь только png-файлы% 04d, не беспокоясь о непрерывности нумерации.
Гьян

2
Я почти уверен, что вам нужно заключать *.pngв одинарные кавычки (чтобы '*.png'), чтобы он не расширялся оболочками в стиле Unix (то есть OSX, Linux и т. Д.).
evilsoup

1
К сожалению, разработчики ffmpeg делают опцию поддержки глобализации файлов ! Стандартные сборки Windows не включают его.
Тимммм

9

С http://www.ffmpeg.org/faq.html : Если у вас есть большое количество картинок для переименования, вы можете использовать следующую команду, чтобы облегчить бремя. Команда, используя синтаксис оболочки Bourne, символически связывает все файлы в текущем каталоге, которые соответствуют * jpg, с каталогом / tmp в последовательности 'img001.jpg', 'img002.jpg' и так далее.

x=1; for i in *jpg; do counter=$(printf %03d $x); ln -s "$i" /tmp/img"$counter".jpg; x=$(($x+1)); done


Я использовал это , чтобы объединить несколько последовательностей seqA-[0001-n].png, seqB-[0001-n].pngи т.д. Намного проще , чем возиться с IMAGE2 и строятся по Concat фильтра.
z0r

Для меня это не работало , пока я не заменил for i in *jpgс for i in /full/path/*jpg, потому что все алиасы были разбиты
Jezzamon

4

Я бы на самом деле предложил то же самое, что предложил Малвя. Всякий раз, когда мне нужно было делать подобные вещи при работе с 3D-рендерингами анимации, я переименовывал файлы, чтобы сделать их последовательными. Так проще работать с множеством разных программ, если по какой-то причине вам не нужно сохранять имена файлов. Total Commander также является отличным инструментом для многократного переименования.


В итоге я сделал нечто подобное (скрипт переименования Python).
Разбойник

3

Для недостающей части последовательности я использовал 2 вкладыша

CONCAT=$(echo $(ls *.png | sort -n -t _ -k 2) | sed -e "s/ /|/g")
ffmpeg -framerate 25 -i "concat:$CONCAT" -c:v libx264 -profile:v high -pix_fmt yuv420p output.mp4

Надеюсь, что это поможет кому-то в будущем

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.