1

У меня есть последовательность файлов:

file0.png, file1.png, ..., file10.png,... file100.png, ..., file1000.png, file1001.png, ..., file10000.png

Я хочу сделать видео с ffmpeg,

ffmpeg -framerate 30 -pattern_type glob -i '*.png' -c:v libx264 out.mp4

Соглашение об именах приводит к неправильному порядку файлов, читаемых при вводе. Как я могу решить это?

так называемое решение «Как переименовать кучу файлов в командной строке?"не работает!

2 ответа2

1

Поскольку у archlinux есть некоторые проблемы с утилитой переименования, я загрузился на живую Ubuntu и сделал переименование.

rename 's/\d+/sprintf("%05d", $&)/e' *.png  

Это то, что было сделано, чтобы переименовать последовательность файлов.

0

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

Поэтому вместо этого вы должны переименовать ваши файлы для ввода в нужном вам порядке. Я предполагаю, что вы используете оболочку bash, файлы находятся в одном каталоге с именами от file1.png до file10000.png и вы предпочли бы, чтобы они назывались file00001.png и file10000.png .

#!/bin/bash
for f in file*.png
do
  printf -v n "file%05d.png" "${f:4:-4}"
  mv "$f" "$n"
done

На одной строке как:
for f in file*.png; do printf -v n "file%05d.png" "${f:4:-4}"; mv "$f" "$n"; done

или, может быть, просто:

#!/bin/bash
for (( i=0; i<10000; i++ ))
do
  printf -v n "%05d" $i
  mv "file$i.png" "file$n.png"
done

На одной строке как:
for (( i=0; i<10000; i++ )); do printf -v n "%05d" $i; mv "file$i.png" "file$n.png"; done;

Я не уверен, что быстрее, но я подозреваю, что второй будет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .