久し振りのDTVネタ。「Amatsukaze」とは、生のtsファイルを一般的な動画の拡張子(mp4など)にエンコードするソフトです。そもそもtsとは何ぞや?という方は以下の記事を参照ください。
今回実現したいこと
- トリムしたそれぞれの先頭にチャプターを付与させる
- プロファイルの「チャプター・CM解析を無効にする」にチェックを入れた状態で実現させる
一見矛盾しているように聞こえますがどういうことなのかというと…今回想定する主な編集対象はWS(ワイドショー)となります。WSで欲しい部分といえばお目当ての数分のみであり、それ以外はバッサリ消去することがほとんどとなります。当然、CM解析は不要となりますが、チャプターを打つ処理とCM解析はセットになってしまっているようで、開発者様のブログのとあるコメントを見たところ改良する予定もないようでした。


では「チャプター・CM解析を無効にする」のチェックを外せばよいだけでは…?と思われるのですが、このCM解析というのが非常に処理時間がかかるのです。CM解析しなくていいのにダルいなぁ、そもそも何故そんな設計に…?一般的な市販のレコーダーで部分消去する時は自動でそれぞれの先頭にチャプターが付与されるので、その機能をやってほしいだけなのだけど…と非常にもどかしい気持ちになりました。コードを読み解いて修正して自前でビルドするのも考えましたが、
- 「チャプター・CM解析を無効にする」にチェックを入れる
- mp4boxを自前でインストールし、チャプター付与の処理を実行後バッチとして実行する
…という簡単に実現出来る方法を取りました。
「Amatsukaze」導入手順
この機会に最新バージョン(1.0.8.0)を導入しましたので、せっかくなので編集作業で使用する「AvsPmod」などを含めて、手順を残しておきます。手順といっても基本はREADMEに記載されていますので、私個人の備忘録になります。
「Amatsukaze」本体のインストール
ソフトとしてインストールするものではないので、配布されている7zを解凍するのみでOKです。使い方はこちらのREADMEに詳細に記載されています。以前は本体はvbsファイルでしたがいつの間にかbatに変わっていました。
「AvsPmod」のインストール
avsファイル専用のテキストエディタになります。「Amatsukaze」READMEの『CM位置入力 カット調整』の章に説明がある通り、これをインストールせずともWebUIからカット処理が行えるようなのですが、私は別のソフトで編集しTrimファイルを作成しています。「AvsPmod」の使い方は以下の記事を参考にしました。

「AviSynth+」のインストール
「AvsPmod」を64bit環境で動かすためにインストールします。

「GPAC」のインストール
チャプター付与を行うソフトです。以下公式サイトから自身の環境に合わせた最新のexeを選択し、インストールします。
『環境変数を編集』より「mp4box」にPATHを通し、自作バッチファイル内で「mp4box」のコマンドを使用出来るようにします。

カット調整・エンコード手順
フレーム番号取得のための事前準備
まずは事前準備として、「Amatsukaze」READMEに記載されている通り、使用プロファイルで「一時フォルダを削除せずに残す」を選択して「CM解析のみ」実行します。その際、時間削減のためプロファイルで「チャプター・CM解析を無効にする」にもチェックを入れておきます。CM解析を実行するんじゃないの?と思われるかもしれませんが、このフェーズの目的はフレーム番号を確認するために本来一時ファイルであるavsファイルを出力させることであり、そのためにはCM解析自体は必要ありません。一時ファイルを出力させる最短の手順としてエンコードそのものではなく「CM解析のみ」を選択する、といった感じです。私は「手動カットPreTask」という名称でプロファイル作成しています。

「AvsPmod」でトリムポイント編集
avsファイルを開く
「一時フォルダを削除せずに残す」を選択したことにより、基本設定の一時フォルダに指定したフォルダに「amt***」のフォルダ名で一時ファイルが作成されているはずです。その中の「amts0.avs」を開きます。最初は拡張子avsはどのプログラムも紐づいていないと思われますので「プログラムから開く」から事前にインストール済みの「AvsPmod.exe」を選択して開きます。

再生ボタンを押下すると、動画を確認することが出来ます。

マクロ > ファイルからブックマークをインポート を実行
「chapter_exe0.txt」を選択すると、自動で作成されるブックマーク(チャプターの開始点)が反映されます。今回自動で作成されるブックマークは不要なので何故この操作をするのかというと…この操作をしないと、この後編集するトリムポイントそれぞれの開始点にブックマークが自動で作成されないのです…。何故かはわかりませんがこの操作を踏むと自動で作成されるようになるので、私は毎回初めに行っています。なお、チャプターを付与しない場合(残すポイントが1か所しかない場合など)はこの操作およびこの後紹介するブックマークの操作は不要です。
トリムエディタを起動させ、トリムポイントを設定
スライダーや方向キーを駆使しつつお目当てのフレームまで移動させます。残したいフレームの先頭でhomeキー(ショートカットキーが初期状態の場合)を押下すると、トリムエディタが起動します。選択オプションを「選択された範囲を残す」にしている場合、残る側の映像という目印である緑の丸が左上に表示されます。(1フレーム前に移動すると赤の丸に変わるはずです。)残したい範囲の末尾に移動させendキーを押下します。選択箇所が1つのみであればこれでよいですが、複数ある場合は同じように操作を繰り返します。全てのトリムポイントの設定を終えた後に「適用」を押下します。Trimファイルは1行で出力させる必要があり、都度適用を押してしまうと全体を通してフレーム番号が合わなくなるためご注意ください。「選択された範囲以外を残す」にする場合は逆に消去したいポイントの先頭と末尾を指定する操作をします。


「適用」を押下すると、上部のエディタにTrim(32321, 34123)のようにトリムポイントの記述が出力されます。欲しい情報はこの1行のみのため、デフォルトの1~4行目を削除してこの1行のみの状態で「(tsファイル名(.tsを含む)).trim.avs」の名称で、tsファイルが存在するフォルダと同じフォルダに保存します。


必要に合わせてブックマークを追加・削除
トリムポイントの先頭に自動でブックマークが作成されているはずですが、ゴミのブックマークが残っている場合、該当のブックマークのフレームに移動させ「Ctrl + B」(ブックマーク操作のショートカット)で削除します。追加で付与したいチャプターがある場合は、同様の手順でブックマークを追加します。忘れがちなのが、0フレーム目にブックマークを追加することでしょうか。(そうしないと1つ目の区間にチャプターが付かないため)
これはトリムポイントが複数の場合の実際の編集画面ですが、このようにブックマークを綺麗にします。

マクロ > ブックマークをチャプタに変換 を実行
この後実行する自作バッチファイルのために「(tsファイル名(.tsを含む)).chapter_exe0.txt」の名称で、tsファイルが存在するフォルダと同じフォルダに保存します。このマクロは標準で組み込まれており、チャプター生成用のテキストファイルを生成するという内容になりますが、
- 実際のフレーム番号と1フレームずれる(1フレーム前にチャプターが付与されてしまう)
- トリムしたはずの範囲のチャプターがゴミとして残る
- チャプター名がフレーム番号?になっていてわけがわからない
…という残念な点があります。

「マクロ > マクロフォルダを開く」から実際のマクロファイルを確認することが出来ます。拡張子pyなのでPythonで書かれており、自前でビルドなどはする必要ないのでこのファイル自体(Bookmarks to Chapter.py)を私の方で修正した上で実行してみました。修正後のファイルはこちら。修正ポイントは以下です。
時刻計算を「小数丸め」から「ミリ秒切り上げ」に変更
変更前
m, s = divmod(bookmark/fps, 60)
h, m = divmod(m, 60)
timecode = 'CHAPTER%02d=%02d:%02d:%06.3f\n' % (chapter, h ,m, s)
変更後
total_ms = int(math.ceil((float(frame) * 1000.0 / fps) - 0.000001))
これでチャプター時刻を作る際に、期待フレームより前に丸め落ちしにくくしています。
現在の出力フレーム数を取得して、範囲外ブックマークを除外
追加
frame_count = None
for name in ('GetVideoFramecount', 'GetVideoFrameCount', 'GetFramecount', 'GetFrameCount'):
try:
frame_count = int(getattr(avsp, name)())
break
except:
pass
除外処理
if bookmark < 0:
continue
if frame_count is not None and bookmark >= frame_count:
continue
これでTrim後の出力範囲外にあるブックマークはチャプター化しないようにしています。
チャプター名を常に自動生成に変更
変更前
if not title:
title = 'Chapter %02d' % chapter
title = 'CHAPTER%02dNAME=%s\n' % (chapter, title)
変更後
title = 'CHAPTER%02dNAME=Chapter %02d\n' % (chapter, chapter)
ブックマーク名があっても無視して、必ず Chapter 01 形式にしています。もし任意のチャプター名を設定したい場合は、マクロ実行後に出力されたテキストファイルを手動で修正します。
ファイル書き込み位置をループ外に移動
forの中で毎回書き込みしていましたが、修正版は最後に1回だけ実行。
f = codecs.open(filename, 'w', 'utf-8')
f.writelines(text)
f.close()
実行後バッチファイルを格納
7zから解凍したAmatsukazeには「bat」フォルダが用意されていますが、そこに「実行後_チャプター付与.bat」ファイルを用意します。内容としてはチャプターファイルが存在するかをチェックし、存在すればmp4Boxでチャプターを付与し、終了コードを返すという簡単な処理です。チャプターファイルのファイル名を変えたい!といった場合には、“fileName%.ts.chapter_exe0.txt”の箇所を各自でカスタマイズしてください。
@echo off
REM エンコード後のmp4ファイルのパス
set "mp4File=%OUT_PATH%"
echo mp4File: %mp4File%
for %%I in ("%IN_DIR:~0,-1%") do set "parentDir=%%~dpI"
echo parentDir: %parentDir%
for %%I in ("%mp4File%") do set "fileName=%%~nxI"
echo fileName: %fileName%
REM tsと同じフォルダにあるチャプターファイルのパスを作成
set "chapterFile=%parentDir%%fileName%.ts.chapter_exe0.txt"
REM チャプターファイルが存在するかチェック
if not exist "%chapterFile%" (
echo チャプターファイルが見つかりません: %chapterFile%
exit /b 1
)
REM mp4Boxでチャプターを付与
mp4box "%mp4File%.mp4" -chap "%chapterFile%" >nul 2>&1
REM 終了コードをAmatsukazeに返す
if %ERRORLEVEL% EQU 0 (
echo チャプターの付与に成功しました。
) else (
echo チャプターの付与に失敗しました。エラーコード: %ERRORLEVEL%
)
exit /b %ERRORLEVEL%
「Amatsukaze」でエンコード
ここまできたら事前準備は完了のため、いよいよ本題のエンコード処理を開始します。プロファイルはデフォルトから以下を変更します。
- 出力選択「CMをカット」
- 実行後バッチ「実行後_チャプター付与.bat」(自作バッチファイルのファイル名)
- 「チャプター・CM解析を無効にする」にチェック
コンソールの最後に「チャプターの付与に成功しました。」と表示されていれば、処理は成功です。チャプターを付与する必要がない場合は、実行後バッチは「なし」でOKです。
一時フォルダを削除
前手順で出力された「amt***」のフォルダは不要になります。これは容量がかなり大きいため、エンコードまで完了したら忘れないうちに速やかに削除しましょう。
以上が一通りの手順となります。通常の機能通りCMカットを行いたい場合は、READMEに詳細に記載されているため、ロゴ解析の手順など含めてそちらを参照してください。皆様、充実したTS抜きライフを。



コメント