タイムラプス動画の作り方

タイムラプス動画を作る機会があったので、やり方をメモしておきます。 簡単だよ!

TL;DR

ls -t1 *.jpg | tac | nl | awk '{print "mv", $2, $1.".jpg"}' | sh
ffmpeg -r 24 -i ./%d.jpg -vcodec libx264 -y -s 1920x1080 ./output.mp4

問題:ffmpegは1から始まる連番画像しか変換できない

1.jpg, 2.jpg, ... という連番画像ファイルを用意して、

ffmpeg -r 24 -i ./%d.jpg -vcodec libx264 -y -s 1920x1080 ./output.mp4

とやれば動画のできあがりです。 簡単ですが、ffmpegは1から始まる連番ファイル名じゃないと、動画が作れません。 大抵のデジカメのファイルって、DSC5621.jpg とか _MG_2912.jpg みたいにデジカメ側が割り当てた番号が振られてますよね。 番号が1が始まることは、殆ど無いので、どうやってスマートにファイル名を変換するかが命です。

連番ファイル名の変換

ぱっと思いつく方法だと、for でできる。でも、なんかかっこ悪い。ワンライナーが良い。

f=($(ls -t1 *.CR2));
for i in $(seq 1 ${#f[@]}); do
  mv "${f[$i]}" "$i.jpg"
done

調べているうちに、行番号をつけるコマンド nl を使う方法を思いついた。

ls -t1 *.jpg | tac | nl | awk '{print "mv", $2, $1.".jpg"}' | sh

最後、シェルコマンドを生成して実行するのは反則っぽいけど、ワンライナーでいける!やっほい!