Сборка таймлапсов и ffmpeg

Съездил в Марокко и наснимал кучу таймлапсов, которые по приезде пришлсь собирать. Но как?

Сортировка

Камера отдает в одну папку тысячи файлов, которые ещё нужно:
+ выбрать обычные, не таймлапс, снимки;
+ переименовать файлы по дате съемки, так как камера нумерует файлы 4-х цифровым зацикленным индексом;
+ разделить на отдельные сеты.

Первый этап пока что решается ручной сортировкой по размеру, второй — полуручным образом через Pyrenamer. Третий — следующим костылем:

#!/bin/sh
# Goes through all jpeg files in current directory, grabs date from each
# and sorts them into subdirectories according to the date
# Creates subdirectories corresponding to the dates as necessary.

for fil in ./.jpg # Also try .JPG
do
datepath="$(identify -verbose $fil | grep DateTimeOri | awk '{print $2 }' | sed s%:%/%g)"
if ! test -e "$datepath"; then
mkdir -pv "$datepath"
fi

mv -v $fil $datepath

done

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

Первичная сборка

Теперь все кадры нужно собрать в стопку как есть, в jpeg. Параметр -r 15 задает частоту кадров. Здесь 15 подобралось, как довольно неплохой старт для поиска оптимальной «скорости».

do
echo "${D%?}"
ffmpeg -r 15 -pattern_type glob -i "./${D%?}/*.JPG" -c:v mjpeg -q:v 2 "${D%?}.avi";
done

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

Окончательная сборка

Осталось сконвертировать полученное в видео с нормальным кодеком (x264) и контейнером (mkv). Параметр -crf 15 задает качество компрессии (по умолчанию — 23).

for D in *.avi
do
echo $D;
ffmpeg -i "$D" -c:v libx264 -preset veryslow -crf 15 "${D%.avi}.mkv";
done


Пока что процесс не сильно отлажен, но уже работает. Вот, например, улов той поездки.