(2017/11/05追記)事情が古くなってきたので、「ゲーム動画のエンコード事情を整理」も参照してください。
(2015/12/21追記)VBScriptコードのAUCパス設定を修正、OneDriveでスクリプト公開。
(2014/08/17追記)VBScriptコードの比較ミスを修正。
AviUtlという有名なフリーソフトがあります。これは単体では動画のカットやフィルタなど簡単な編集ができますが、各種プラグインを導入することで対応フォーマットが増えたり、動画編集機能が大幅に強化されたり・・・とフリーソフトにしてはかなり優秀で、私もエクストルーパーズの動画をニコニコやYouTubeに投稿する際に利用させてもらいました。**「拡張編集」プラグインで編集し、「拡張 x264 出力(GUI) Ex」**プラグインで.mp4出力しています。編集と.mp4出力がこのソフト1本で完結するのですごくありがたい(もちろん必要な環境を準備すればの話)。
まあ、今回は動画編集じゃなくて、単にエンコードするだけの話なんですが。
HDキャプボ買ってから、エクストルーパーズの対戦動画をよく撮るようになったんですが、これがたまるたまる・・・。録画ファイルは.aviなのですが、そのままだと非常に重いので、.mp4にしないとすぐにHDDがパンパンになってしまいます。今まで、自分でファイル名を入力して、ひとつずつバッチ登録して、バッチ出力で寝てる間に一括してエンコードしてました。が、このバッチ登録は手で行う必要があったため、それがめんどくさくて後回しにしてると、動画がたまるたまる・・・。
で、自動化できないの!?というのが本題。
ここで紹介するスクリプトはOneDrive上に配置したので、下記からダウンロードして下さい。
自動でAviUtlの出力プラグインを利用する
肝心の方法ですが、調べたら、やっぱりありました。
大雑把にやってることを説明すると、AviUtlを外部から操作するための小規模なプログラムを集めた**「AviUtl Control」**をスクリプトから組み合わせて利用することで自動化を実現しています。「AviUtl Control」にサンプルとして用意されている sample1.vbs スクリプトでは、指定ディレクトリ直下のファイルすべてを出力プラグインによりエンコードしています。流れとしては、次のようになります。
- 起動しているAviUtlがあれば特定し、なければ起動する。
- 指定ディレクトリ直下のファイルのリストを得る。ファイルがなければ終了。
- 修正日時が最も古いファイルを指定の出力プラグインでエンコードし、指定ディレクトリに出力する。
- エンコード済みの入力ファイルを指定ディレクトリに移動。
- 2.に戻る。
このサンプルスクリプトは先頭にディレクトリの指定とかの記述があるので、ここを書き換えて実行すればいいわけです。スクリプトはVBScriptという言語で書かれていて、Windowsなら標準で使えるというものです。なので、今回必要なものをまとめると以下のようになります。
- AviUtl本体
- 利用したいAviUtl出力プラグイン(私は「拡張 x264 出力(GUI) Ex」を利用)
- AviUtl Control(と付属するサンプルスクリプト)
サンプルスクリプトの修正
サンプルスクリプトでも最低限の要求は満たしていると思いますが、サブディレクトリが考慮されないとか、チェックが甘いので途中で実行をやめたいときに困るとかいった問題があるので、これに対応したいと思います。修正版は以下になります。
元のスクリプトにtypoがあったのも修正しました(ver1.5)。VBScriptは初めて触ったんですが、言語仕様は難しくないのに、独特の癖があって意外と苦労しました・・・。主に参考にしたのは、以下のサイト。
- VBScript 基礎文法最速マスター - CX’s VBScript Diary - VBScript グループ
- Vacant-Eyes Tips - Windows Script Host - Scripting.Dictionaryオブジェクトを使う
あとは、FileSystemObjectの使い方を調べたとかですかね。
修正版では、サブディレクトリを考慮して動きます。入力ファイルが「{指定入力元ディレクトリ}/{サブディレクトリ}」にあるとすると、出力ファイルは「{指定出力先ディレクトリ}/{サブディレクトリ}」に吐き出され、エンコード済みの入力ファイルは「{指定移動先ディレクトリ}/{サブディレクトリ}」に移動されます。サブディレクトリの構造を維持するということです。対応するサブディレクトリが存在しなければ、作成します。
気をつけなければいけないのは、「指定した入力元ディレクトリ下にファイルが存在しなくなること」が終了条件なので、エンコード後のファイルの退避ができなければ終了しません(元のスクリプトも同じです)。つまり、入力元と移動先は別の場所にする必要があります。修正版は、起動中のAviUtlが存在するかどうか頻繁に確認し、なければ処理を中断する処理も追加しています。
他に気をつけたいのは、AviUtlを複数起動しているときの対応をしていないので、複数起動しないこと。それと、出力ファイルの存在確認を入れてみましたが、出力途中でも残る可能性があるので(実際、私の場合は残る)、**途中でやめたかったら、速やかにエンコードの中止とAviUtlの終了を行ってください。**AviUtlが終了すれば消滅を確認した後にスクリプトも終了します。
Pythonで書き直してみた
VBScriptクソクソ!とか叫びながら、ついでにPythonで書き直してみました。実行するにはPython 2.x系を導入している必要があります。
若干、機能を追加していますが、基本的にやってることは変わりません。エラーが起きたら、エラーを表示してエンターキーが押されるまで待機します。エラー内容を表示するだけでもないよりかなりマシだと思う。
ちゃんと動作確認してないけど、エンコード済みのファイルを移動させたくなかったら、COMPLETED_DIR を None にすれば多分対応してます。最初に作ったファイルリストが空になるまで処理を繰り返す形に変えたので、入力元ファイルを移動させなくてもいいってことです。
あと、これも試してませんが、plugout を plugbatch に置き換えれば、エンコードはせずにバッチ登録だけしてくれる筈です。そうすれば、一括でバッチ登録してくれるようになりますね。バッチ登録リストはAviUtlの方で管理していて、処理が完了していないものは自分でリストから消さない限りちゃんと保持してくれるメリットがあります。このように、あとでまとめてバッチ出力する場合では、入力ファイルを移動されると困るので、COMPLETED_DIR を None にしましょう。
「AviUtl Control」には、各実行ファイルのソースコードも付属しています。中身見ればわかりますが、やってることは単純です。PythonにはWin32APIのモジュールも用意されているので、Pythonだけですべて実装することもできそうですね。
ゴミの削除
エンコード済みのファイルや、エンコードの際に出力された必要のないファイル(「拡張 x264 出力(GUI) Ex」を使うと.statsファイルと.stats.mbtreeファイルができる)を消したいので、バッチファイル作りました。これを実行すると、バッチファイルの存在するディレクトリ以下に対して、削除処理を行います。
.aviファイルの削除
.statsファイルと.stats.mbtreeファイルの削除
おしまい。
これで今まで以上に動画撮りまくれるぞー!やったー!