一つ前の記事で書いたように、Warsow の demoavi というコマンドについて調べていたら、Warsow Wiki で Movie Making という記事を発見。で、ちょっと読んでみたら結構簡単そうだったので早速ムービーを作ってみました。
何しろ PC でムービーを作るのは初めてなのでほとんどわかってないんですが、こんな手順で Warsow Movie が作れます。
画面のキャプチャ
まず、Warsow を起動してムービーのための設定をしておきます。詳しくは Warsow Wiki の Movie Making を参照してもらうとして、コンソールから以下のように入力しました。ちなみに r_mode で解像度を変えた場合は vid_restart で有効になります。
cl_demoavi_fps 125 // or 90, 166, 333
r_mode 15 // Wide 1440x900
cl_demoavi_scissor 0
r_screenshot_jpeg 1
r_screenshot_jpeg_quality 100
bind UPARROW "demojump 0"
bind DOWNARROW "demopause"
bind LEFTARROW "timescale 1"
bind RIGHTARROW "timescale 4"
bind n "demoavi"
上記設定をした後、キャプチャしたいデモを再生して撮りたいシーンになったら demoavi を実行します(この例では n キーに割り当てています)。シーンが終わったら再度 n を押してキャプチャを止めます。そうすると warsow/basewsw/avi フォルダに avi000000.jpg みたいな連番の jpeg ファイルがずらずらと出力されますので、これらのファイルをどこかに保存しておきます。
音のキャプチャ
もし、ゲーム中の音もムービーに入れたい場合は、再度同じデモのシーンを再生しながら Audacity 等のソフトで録音しておきます。私はこのソフトを使って WAV ファイルに保存しました。録音するための設定等は Warsow Wiki の Recording sound を参照してください。
動画編集
次に、動画編集ソフトを使って、先程生成した連番の jpeg ファイルを avi に変換します。とりあえず、私は動画編集ソフトを持っていなかったので、オープンソースソフトウェアの VirtualDub を使いました。まず、VirtualDub を起動して File -> Open video file... で読みこみたい連番 jpeg ファイルの最初の画像を指定します(例えば avi000000.jpg)。そうすると、連番のファイル全てが読みこまれます。次に Video -> Framerate でフレームレートを指定します。ここでは 125 fps でデモをキャプチャしましたので、"Source rate adjustment" のところで 125 を指定します("Change to 125 frames per second")。
ゲーム中の音を入れる場合は Audio -> WAV Audio... で WAV ファイルを指定しておきます。ちなみに、画面と音がずれる場合は Audio -> Interleaving... の "Audio skew correction" のところで、"Delay audio track by 0 ms" を指定して調整します。音が速すぎる時は正の数、音が遅すぎる時は負の数を指定するそうです。
いよいよ avi に変換します。File -> Save as AVI... で出力ファイルを指定すると変換がはじまります。この処理は結構時間がかかります。なお、出力されるファイルは結構サイズが大きいです。1440x900、125fps、10秒の元データを、無圧縮の avi にすると数GByte になりました。
動画圧縮
無圧縮の avi ファイルが出来たら、動画圧縮ソフトで圧縮してやります。私は オープンソースソフトウェアの FFmpeg を使いました(というか、実際使ったのは 携帯動画変換君 :))。こんなオプションで圧縮しました(H264 848x480 40fps 8000bps)
ffmpeg -y -maxfr 40 -i 入力ファイル.avi -bitexact -vcodec h264 -coder 1 -bufsize 128 -g 250 -s 848x480 -b 8000 -acodec aac -ac 2 -ar 48000 -ab 64 -f mp4 出力ファイル.mp4
携帯動画変換君の場合はこんな感じです。
[Item5]
Title=848x480 40fps 8000bps
TitleE=848x480 40fps 8000bps
Command0=""<%AppPath%>\cores\ffmpeg" -y -maxfr 40 -i "<%InputFile%>" -title "<%Title%>" -timestamp "<%TimeStamp%>" -bitexact -vcodec h264 -coder 1 -bufsize 128 -g 250 -s 848x480 -b 8000 -acodec aac -ac 2 -ar 48000 -ab 64 -f mp4 "<%OutputFile%>.mp4""
完成 :D
出来上がった動画ファイルはこれです。コーデックが H264 なので VideoLAN (VLC) や QuickTime で再生できます。かなり重い動画です :P。
ちなみにこれは、先日行なわれた
RACEATHON という
Warsow レース大会に参加したときの第1レースの動画です。
補記: スムースな動画を作るには
この 記事 によると、160 fps でキャプチャして 40 fps にリサンプリングするとスムースな動画が出来るそうです。この記事では Vegas という動画編集ソフトでやったと書いてあるのですが、VirtualDub でも似たようなことがフィルタを使って出来るようです。やり方は Video -> Filters... で "Add..." を押して "temporal smoother" というフィルタを導入すると複数フレームをなめらかに補完してくれるようです。
temporal smoother なしだとこんな感じです。1フレーム毎の画像は綺麗ですが、動画として見るとあまり綺麗に見えません。
こちらは temporal smoother あり。1フレーム毎の画像はぼやけていますが、動画にすると綺麗に見えます。
P.S. せっかく長文を書いたので、近いうちに Warsow Japanese Wiki のほうにもまとめておきたいと思います =)