タイムラプス動画の作り方
タイムラプス動画を作る機会があったので、やり方をメモしておきます。 簡単だよ!
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
最後、シェルコマンドを生成して実行するのは反則っぽいけど、ワンライナーでいける!やっほい!