2015/07/18

既存動画から『タイムラプス』を作る方法を考える。

 タイムラプス、というものをご存知だろうか。口で説明するより実際に見ていただいたほうがわかりやすいと思うので、参考動画をYoutubeで見つけてきた。

 タイムラプスの基本は「コマを落とす」ということだ。普通の映像は1/30秒なり1/24秒なりに1回画像を撮影し、それをつなぎあわせる。この撮影間隔をより長く取ることで、上の参考動画のようにスピード感のある動画を撮影することができる。

 「タイムラプス 作り方」などと検索すると、カメラを固定して一定間隔で撮影して、それをつなぎあわせて動画にする、などという記事が山ほど出てくる。
 調べているうちに気づいたのだが、「タイムラプス」という言葉はどうもひとり歩きしているようだ。本来、一定間隔で撮影した写真を動画にしたものを指すようだが、動画のコマを落とす(実質的には早送り)ものもタイムラプスと呼称している例も見られる。「タイムラプス」って、一体何なんだ。

 そんな折、Microsoft Hyperlapseなるものが登場したので、もうこれしかないと思って早速試したのだが、このソフトのウリはアクションカムなどで撮影された映像を滑らかにタイムラプスにする、というものらしい。厳密にはタイムラプスとは違うのかもしれないが、これも上記のリンク先では「タイムラプス」とされている。

 というわけで、深いことは考えずに、動画のコマを落としてタイムラプス(っぽいもの)を作ってみることにした。
 まずは動画を1コマずつ画像で出力する。みんな大好きAviUtlの連番BMP出力を使うことにした。この時ポイントがある。それはタイムラプスの特徴につながることなのだが、タイムラプスは「コマ落とし」、つまり、何コマかに1コマを取り出し、それを動画にすればいい、ということになる。要は、すべてのコマを使うのではない。何コマかに1コマだけ必要になる。よって、BMP出力する段階でコマを減らして処理時間の短縮を試みる。この時使うのはAviUtlのフレームレートの変換機能だ。これでフレームレートを1/3にすれば、3コマに1コマだけをBMPで出力することになる。

 何故早送りに編集するのではなくBMPを出力したかというと、理由は2つある。ひとつは、AviUtlは(別途プラグインを用意しなければ)最大1/3にまでしかフレームレートを落とせないから。これではタイムラプスというより、どちらかというと「カクカク」の印象を受ける。もう少しコマを落としたほうがいいと思ったからだ。そしてふたつめは、一度画像を出力することで、一定間隔の画像を動画にするという本来のタイムラプスの定義に近い編集方法を取るようになることで、タイムラプスと言い張りやすくなるからだ。
 手元にはAviUtlで出力した数千コマのBMPファイルがある。数千というと多く感じるが、それでも元動画のコマ数の1/3になっている。このうち20枚に1枚のみ取り出し、元動画比で1/60のコマ落としを行うことにする。当然、数千枚の連番画像のうち、20の倍数番目以外のものを削除すればいいのだが、それを手作業でやる気にはならない。この処理にはPythonでスクリプトを書いた。

# coding:utf-8
# Project_LAPSE


import os
import shutil

#元画像保存フォルダ入力要求
path = raw_input("連番画像保存フォルダのパスを入力してください--->".encode("shift_jis"))

#フォルダ内のファイル名(連番BMPのファイル名)をリスト(files)に代入
files = os.listdir(path)


#リストに格納されたファイル名のうち、20の倍数番目の物のみを別のリスト(outputlist)へ代入
outputlist = []
for i in range(len(files)):
    if i%20 == 0:
        outputlist.append(files[i])

#連番BMPが保存されているフォルダに「output」フォルダを作成
os.chdir(path)
os.mkdir("output")

#outputlistに格納されているファイル名の画像を取得し、outputフォルダに出力
for f in outputlist:
    print f
    src = os.path.join(path,f)
    dst = os.path.join(path,"output")
    shutil.copy(src, dst)
 ざっとこんな感じだ。Pythonは嫌いだが、色々機能があって便利なことは間違いない。嫌いだけど。

 これで、元動画の60フレームごとの画像を取得できたことになる。(もちろん、フレームレート変換とpythonでの処理の組み合わせで他のフレームごと、例えば80フレームごとの画像を取得することもできる。)
 これをつなげて動画にするのだが、AviUtlは連番画像を一括で取り込めるらしいので、この機能を使うことにする。
 今outputフォルダには「00001.bmp」「000020.bmp」…のようなファイルがあるので、これを「00001.bmp」「00002.bmp」という連番に変えなければならない。本当はPythonでその処理もすればよかったし、できないこともないのだが、面倒なのでFlexible Renamerを使ってみた。
 あとはこちらの記事の④AviUtlを使い動画に変換するの方法で動画を出力することができた。

 この方法で出来上がったのが

これ。結構気に入っている。
 しかし、少し画質が落ちているような気もする。連番BMP出力時に画質が落ちたのか、それを再度動画にしてエンコードした際に画質が落ちたのか、それともYoutubeで再エンコードされて画質が落ちたのか、どのタイミングが原因なのかわからない。もう少し色々試してみたいと思う。  折角スクリプトまで書いたし、GTAもただミッションやるだけではなくタイムラプスに丁度いい景色でも探してぶらついてみるのもいいかもしれない。

0 件のコメント:

コメントを投稿