タイムラプス撮影した写真をビデオに繋ぐときのffmpegのオプション

備忘録。タイムラプスビデオというのは数秒間隔で写した動画、いわゆる微速度撮影というやつです。以下はこのあいだの科学の祭典のとき10秒ごとに撮ってた写真を繋げたときのコマンドの例です。


ファイル名を連番に:
$ c=1 ; for i in P728????.JPG ; do ln $i `printf %04d $c`.JPG ; c=$((c+1)) ; done

連続した静止画をffmpegで繋ぐには、元の写真のファイル名を1から始まる連番を含んだものにしてやる必要があります。
ここでは元の写真をリネームするのではなくハードリンクでやってます。

P728????.JPG
Olympus Penの画像ファイル名にマッチ。7月28日のもの。
printf %04d $c
生成した連番を4桁のゼロパディングした整数として表示。
c=$((c+1) )
cの中身に1を足すbashの記法。
連番ファイルを繋いでムービーに:

0001.JPG、0002.JPG…といった連番になった写真を繋いでscifes1_264-10fps.mp4という無音のビデオファイルを生成します。これは「科学の祭典」の動画なのです。
同時に音楽を入れたり、フェードイン、フェードアウトをかけたりすることも出来ますが、そういうことはインタラクティブなビデオ編集ソフトでやった方が楽なので、ここでは繋ぐだけにしています。

$ ffmpeg -r 10 -i %04d.JPG -vcodec libx264 -sameq -vf "scale=1620:1080,pad=1920:1080:150:0,setdar=16:9" scifes1_264-10fps.mp4
-r 10
-rはフレームレートの指定コマンド。入力ファイルの前に置くことでソースのフレームレートを指定している。10秒に1枚のタイムラプスなので、これを-r 0.1とすればリアルタイムになるはず。今回は100倍速で。出力ファイルのフレームレートも出力ファイル名の手前に入れれば指定できる。
-i %04d.JPG
-iは入力ソースファイルの指定。%04d.JPGで4桁整数の連番ファイルになる。
-vcodec libx264
h.264エンコード
-sameq
画質を落とさない。
-vf
ビデオフィルタ・チェーンの開始。続く "scale=1620:1080,pad=1920:1080:150:0,setdar=16:9" がその中身で、前から順番に適用される。
scale=1620
1080: 入力を縮尺して1620x1080ドットにする。今回は写真を16:9ではなく3:2で撮影したので、比率が変わらないようにこの解像度を指定。
pad=1920
1080:150:0: パディング(上下左右の余白)の指定。出力ピクセル数を1920x1080とし、入力ソースの左上の点を左から150ピクセル、上から0ドットになるように合わせて余白を入れる。これで1620x1080のビデオの左右に150ピクセル幅の余白が入り、1920x1080のHDムービーになる。
setdar=16
9: SET the Display Aspect Ratio。表示アスペクト比の指定。無指定だと再生時に間違うこともありうるかも、と思って入れてるけど必要かどうか不明。
scifes1_264-10fps.mp4
出力ファイル名。

ffmpegのオプションの詳細はマニュアルを参照してください。上記の解説は今回使ったオプションについてだけですが、他にもかなり多彩な機能が揃ってます。


で、出力されたやつにYouTubeのビデオエディタで音楽をつけたのがこれ:

3分04秒=5時間6分40秒分の動画です。
ただ、最初のファイルのexifタイムスタンプが09:50:20、最後のファイルが16:49:10なので、本当は7時間分くらいになるはず。2時間弱ほど電池切れで撮れてないところがあるようです。