2011/11/07

AviUtlで手動CMカットした結果をAvisynth用のTrimコマンドにする方法

(12/01/22修正)

私が普段手動CMカットに使用している方法です。所用時間は30分番組1本あたり2分以内程度です。
AviUtlのキーフレーム書きだし機能を使ってCMカットの結果を出力することでAvisynthと連携します。


準備1:必要なものを導入
・AviUtl
・atf02(logoGuilloに同梱)
・Javaランタイム(JRE, atf02の動作に必要です)

準備2:AviUtlを設定
AviUtlの「編集」>「現在のフレームをキーフレームにする」にショートカットキーを割り当てます。
私は右シフトの隣、[\ろ]に割り当てています。
また、「ファイル」>「環境設定」>「システムの設定」で「フレーム番号の表示を1からにする」のチェックを外しておきます。


作業1:キーフレームを打つ
AviUtlの下部のシークバーと左右キー([←]/[→])を使って、CMと本編の境界を探し、キーフレームを打っていきます。
境界のフレームのうち、本編側をキーフレームに指定します。
*CMから本編に入った直後のフレーム、本編からCMに移る直前のフレーム、の順に番組の最後まで打っていきます。
*いきなり本編から始まる場合は一番最初のフレームをキーフレームにします。
*本編で終る場合は一番最後のフレームをキーフレームに指定します。


作業2:キーフレームリストを保存する
AviUtlのメニューで
「ファイル」>「エクスポート」>「キーフレームリスト」
を選び、キーフレームのリストを出力します。
これで手動作業は終わりです。後の工程はBATでの自動処理になります。
*私は後処理の都合上、デフォルトの"ファイル名.txt"にしています。

BAT処理1:キーフレームリストをTrimコマンドに変換
エンコード用のBAT内で、
変数"ATF_PATH"にatf02が置いてあるディレクトリを指定し、
変数"FLIST_PATH"にAviUtlで書き出したキーフレームリストのパスを指定した状態で

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

を実行します。
これで変数"AVS_TRIM"にAvisynth用のTrimコマンドが代入されます。
*変数に代入できれば後はもう自由に出来ると思います。


また、logoGuillo v2.03以降に同梱のatf02で以下のような引数を追加する事で、変数"CHAP_PATH"にオフセット-0.5secを加えたチャプターファイル (*.chapters.txt 形式)出力可能です
エンコード後のmp4に埋め込む事でパート毎のチャプター付mp4が出来ます。

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

BAT処理2:AVSファイルにTrimコマンドを書き込む
AVSファイルの作成は皆さん色々な方法で行っていると思います。
私はBATでマスタAVSファイルをコピー後、CLIのテキスト置き換えソフトでAVSファイル内のキー文字列を置き換える方法をとっています。
AVSファイルのTrimコマンドを挿入したい位置に「#TRIM#」を記述しておき、「#TRIM#」を変数"AVS_TRIM"に格納されたTrimコマンドで置き換えています。

以上で手動CMカットの手順は終わりです。

余談になりますが、logoGuilloのデフォルト出力形式がフレームリストになっているのは手動CMカット/自動CMカットどちらの方法をとっても後段のエンコード処理の内容が変わらないようにする為です。

関連記事

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

エンコード関連記事一覧