Intereting Posts
Замените оболочку входа в систему программой (мини-джейл) Команда не найдена проблема в терминале Linux-Ubuntu Как правильно проверить оставшееся место на диске? Ошибка загрузки загрузчика Fedora установка share davfs всегда запрашивает учетные данные Поиск специальных файлов по второстепенному номеру и большому числу AutoSSH при запуске с парольной фразой или иным образом защищенным ключом? Может ли не-sudoer изменять что-либо за пределами домашнего каталога В чем смысл тильды в некоторой версии версии пакета debian openjdk? Нет KDE: как использовать strigi для индексации моих файлов? Как указать, какой интерфейс использует приложение? Как включить различные фоны для каждого экрана видового экрана в Linux? Закрытие всех окон Nautilus с терминала Вставьте пробел перед первой запятой в файл csv Выполнение команды на сервере, но наличие локальных файлов для чтения / записи на сервере

ffmpeg -pattern_type glob – не загружать файлы в правильном порядке

У меня есть дилемма. У меня есть сценарий какое-то время, которое загружает фотографии с веб-камеры каждые несколько минут. Соглашение об именах просто делает 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 concat одинаковые типы файлов

Вы можете использовать такую ​​команду, чтобы объединить список файлов так, как вы хотите:

 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 formatters

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' …