2012/01/22

logoGuilloの出力結果をAviUtlで確認し修正する方法(半自動CMカット)

私が普段エンコードに使用している半自動CMカットの方法です。(Ver. 12/01/22)

自動CMカット処理の結果を手がかりにして高速にCMカットを行います。
ついでにチャプター情報も生成する事で本編のパート毎に移動可能にします。

人間が行う作業はlogoGuilloの出力結果をAviUtlで確認し、ずれている場合に修正するだけです。
30分番組10本の修正作業に要した時間を計測してみたところ、約24sec/話でした。

エンコード自体はAvisynthで行う事を前提にしていますが、動画を読み込む際に音声も読み込めばAviUtlでのエンコードにも応用できます。

大まかなフローを先に書きます。

1.BATでの自動処理A
  • logoGuilloで.keyframe形式でCMカット結果(仮CMカットファイル)を出力
2.手動作業
  • logoGuilloAUP.aufを導入したAviUtlで動画を開く
  • 本編の出入りのフレームがマークされる
  • マークフレームに移動し、正しい位置をキーフレーム指定
  • キーフレームリストを書きだし(本CMカットファイル)
3.BATでの自動処理B
  • 書き出したキーフレームリストからTrimコマンドとチャプターを生成
  • エンコードしてチャプター埋め込み
では具体的な作業手順に入ります。

0.必要なものを導入する
  • logoGuillo (+動作に必要な環境一式)
  • atf02 (logoGuilloに同梱)
  • logoGuilloAUP.auf (logoGuilloに同梱) 
  • AviUtl(「フレーム番号の表示を1からにする」のチェックを外す)
  • ジャンプウィンドウプラグイン (aviutl_jump_210.lzh)
  • mp4chaps.exe
  • Javaランタイム (JRE, atf02の動作に必要)
1.仮CMカットファイルの生成(自動)

1-1. m2v+aacを用意

m2vとaacを用意します。

1-2.GOPリスト生成

m2v.vfp用のGOPリストをMPEG-2 VIDEO VFAPI Plug-In同梱のmme.exeで生成します。

コマンド例

mme.exe -g -q "video.m2v"

1-3.logoGuilloで自動CMカット

導入マニュアルと同様な方法で.keyframe形式でCMカット結果を出力します。
その際、元のファイル名が"video.m2v"なら、出力ファイル名は"video.m2v.txt"とします。
以後、このファイルを仮CMカットファイルと呼びます。

2.確認作業と本CMカットファイルの出力(手動)

作業の内容自体は私の手動CMカットの方法とほぼ同じです。
AviUtlの動作とキーの設定は AviUtlで手動CMカットした結果をAvisynth用のTrimコマンドにする方法 を参考にして下さい。

2-1.AviUtlで動画を開く

AviUtlのメニューで
「表示」>「logoGuillo連携を有効にする」
のチェックを有効にした状態で"video.m2v"を開きます。
自動的に仮CMカットファイル("video.m2v.txt")が読み込まれ、本編の出入りのフレームがマークフレームに指定されます。

2-2.キーフレームを打っていく

ジャンプウィンドウの左上のボタン
「前の[mark],[key]フレームに移動」
「次の[mark],[key]フレームに移動」
を押してマークフレームに移動します。

マークフレームがCMと本編の境界(の本編側)か確認します。
正しい位置ならそのまま、間違っていたら正しいフレームに移動し、AviUtlで「現在のフレームをキーフレームにする」を実行します。
この操作をショートカットキーに指定しておくと便利です。

*CMから本編に入った直後のフレーム、本編からCMに移る直前のフレーム、の順に番組の最後まで打っていきます。
*いきなり本編から始まる場合は一番最初のフレームをキーフレームにします。
*本編で終る場合は一番最後のフレームをキーフレームに指定します。

2-3.本CMカットファイルを出力

AviUtlのメニューで
「ファイル」>「エクスポート」>「キーフレームリスト」
を選び、キーフレームのリストを出力します。
ファイル名はデフォルトの"video.txt"とします。
以後、このファイルを本CMカットファイルと呼びます。

3.エンコードとチャプター処理(自動)

3-1.atf02でTrimコマンドとチャプターを生成

BAT内の処理で以下のコマンドを実行します。

for /f "usebackq tokens=*" %%i in (`java -cp %ATF_PATH% atf02 "%FLIST_PATH%" -chap "%CHAP_PATH%" -offset -1.0 `) do @set AVS_TRIM=%%i

各パスはフルパスで以下の内容を指定しておきます。
"ATF_PATH"  atf02が置いてあるディレクトリ
"CHAP_PATH" チャプターの出力先("video.chapters.txt")
"FLIST_PATH" AviUtlで書き出した本CMカットファイル("video.txt")のパス

実行すると、変数"AVS_TRIM"にAvisynth用のTrimコマンドが代入されるのでそのままAVSファイルに書き込んでエンコードします。
また、チャプターファイルが"video.chapters.txt"に出力されます。-offset -1.0としているので、理想値より1.0秒手前にチャプターが打たれます。
確実にチャプター位置にシークしたい場合はx264のオプションでkeyintやscenecutを変更して積極的にキーフレーム判定されるようにすると良いと思います。

3-2.チャプターの埋め込み

エンコードしたmp4ファイルにチャプターを埋め込みます。

mp4chaps.exe -i "video.mp4"

を実行すると"video.mp4"にチャプター"video.chapters.txt"が埋め込まれます。

*MP4Boxでチャプターを埋め込むよりも対応プレーヤーが多い為、mp4chaps.exeを使用しています。

*Media Player Classic系のプレーヤーでチャプター付mp4を再生した際にチャプター名が画面中央下に常時表示されてしまう場合は
Play>Subtitles>Enable
のチェックを外せば消えます。


以上で半自動CMカットの方法の紹介は終わりです。
余裕があればもう少し分かりやすく書き直したいと思います。

関連記事

エンコード関連記事一覧