У меня есть дилемма. У меня есть сценарий какое-то время, которое загружает фотографии с веб-камеры каждые несколько минут. Соглашение об именах просто делает new_image((len(files(dir))+1) + '.jpg')
и все в порядке .. до сегодняшнего дня ..
У меня был скрипт Python, который загружает изображения на основе даты создания и отображает их, и я беру данные OpenGL и выгружаю его в фильм, что не сложно, и все в порядке. За исключением теперь у меня есть несколько тысяч изображений и это довольно неэффективно, чтобы продолжать это так (даже это круто, потому что я могу создать свой собственный графический интерфейс и наложение и т. д.). В любом случае, я использую ffmpeg для объединения изображений в слайд-шоу, например:
ffmpeg -f image2 -r 25 -pattern_type glob -i '*.jpg' -qscale 3 -s 1920x1080 -c:v wmv1 video.wmv
Ffmpeg работает отлично, за исключением того, что -pattern_type glob
принимает изображения в порядке именования, который не работает, потому что способ подачи файлов аналогичен, если не тот же, что и ls
, который выглядит так:
user@host:/storage/photos$ ls 0.jpg 1362.jpg 1724.jpg 2086.jpg 2448.jpg 280.jpg 3171.jpg 3533.jpg 3896.jpg 4257.jpg 4619.jpg 4981.jpg 5342.jpg 5704.jpg 6066.jpg 650.jpg 1000.jpg 1363.jpg 1725.jpg 2087.jpg 2449.jpg 2810.jpg 3172.jpg 3534.jpg 3897.jpg 4258.jpg 461.jpg 4982.jpg 5343.jpg 5705.jpg 6067.jpg 651.jpg
0, 1000, 1, 2000, 2
… это логика ls
так что последовательность изображений (timelapse) будет полностью изменена.
Любые идеи о том, как использовать ffmpeg для загрузки изображений более упорядоченным образом?
Вы можете использовать такую команду, чтобы объединить список файлов так, как вы хотите:
ffmpeg -f concat -i <( for f in *.wav; do echo "file '$(pwd)/$f'"; done ) \ output.wav
Вышеизложенное может работать только в том случае, если файлы, которые вы конкатенируете, являются одинаковыми кодеками. Таким образом, все они должны быть .wav или .mpg, например.
ПРИМЕЧАНИЕ. Для использования декомплекса concat необходимо использовать ffmpeg v1.1 или новее, вы можете прочитать больше об этом примере, а также о том, как объединить разные кодеки, используя эту технику на веб-сайте ffmpeg .
Ffmpeg также может принимать входные данные с помощью форматировщиков printf, таких как %d
. Это соответствует цифрам, начинающимся с 0 и идущим оттуда по порядку. Если числа были структурированы следующим образом: 000 – 099, вы можете использовать этот форматтер, %03d
, что означает серию из трех цифр с нулевым дополнением.
Поэтому вы можете сделать что-то вроде этого:
ffmpeg -r 25 -i %d.png -qscale 3 -s 1920x1080 -c:v wmv1 video.wmv
Вышеупомянутое не совсем сработало для меня, ffmpeg
жаловался на вариант -c:v
. Я просто опустил этот параметр, и эта версия команды работала так, как ожидалось.
ffmpeg -r 25 -i %d.png -qscale 3 -s 1920x1080 video.wmv
Самый простой способ – переименовать короткое имя файла, чтобы иметь начальные нули, используя инструмент rename
. Однако есть два стандартных инструмента переименования – тот, который я описываю, описывается как из Справочного руководства программистов Perl на странице руководства. Это версия для Debian и производных дистрибутивов.
rename 's/^/000/' [0-9].jpg rename 's/^/00/' [0-9][0-9].jpg rename 's/^/0/' [0-9][0-9][0-9].jpg
Затем имена файлов должны корректно сопоставляться с использованием глобусов.
Однако, если вы не хотите переименовывать файлы, вы не можете использовать globs, поскольку расширение в лексикографическом порядке, а не числовое.
Итак, не используйте глобусы. Избавьтесь от -i %d.jpg
и используйте -i %d.jpg
вместо -i *.jpg
. Это использует числовой шаблон и в моем быстром тестировании делает то, что вы хотите.
Лучший способ – переименовать файл, чтобы все они имели одинаковое количество цифр. С zsh ( 4
– максимальное количество цифр):
autoload zmv # put this in your ~/.zshrc zmv '(<->).jpg' '${(l:4::0:)1}.jpg'
С другими оболочками (продолжайте и добавьте 0
если необходимо, если есть имена файлов с более чем четырьмя цифрами):
for x in [0-9].jpg; do mv "$x" "000$x"; done for x in [0-9][0-9].jpg; do mv "$x" "00$x"; done for x in [0-9][0-9][0-9].jpg; do mv "$x" "0$x"; done
Если вы не можете переименовать файлы, другой вариант – создать символические ссылки в другом каталоге. С zsh:
zmv -Ls '$PWD/(<->).jpg' '/somewhere/writable/${(l:4::0:)1}.jpg'
С любой оболочкой:
for x in [0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/000$x"; done for x in [0-9][0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/00$x"; done for x in [0-9][0-9][0-9].jpg; do ln -s "$PWD/$x" "/somewhere/writable/0$x"; done
Альтернативный подход состоит в том, чтобы дать символическим ссылкам последовательные номера. Этот подход обобщается на другие ситуации, когда порядок исходных файлов неверен, пока вы создаете символические ссылки в нужном порядке. Запуск счетчика при 10000 и удаление ведущего 1
– удобный способ получения счетчика с ведущими нулями.
i=10000 for x in [0-9].jpg [0-9][0-9].jpg [0-9][0-9][0-9].jpg; do ln -s "$PWD/$x" /somewhere/writable/${i#1}.jpg i=$((i+1)) done
Если вы действительно не хотите писать, вы можете передавать последовательные параметры -i
с увеличением длины имен файлов.
ffmpeg -pattern_type glob -i '[0-9].jpg' -i '[1-9][0-9].jpg' -i '[1-9][0-9][0-9].jpg' -i '[1-9][0-9][0-9][0-9].jpg' …