読者です 読者をやめる 読者になる 読者になる

シーラカンスの非日常

サブカルの海から発信中

aviutlによるTSエンコード入門~バッチファイル編(BonTsDemux)~

前回の記事:aviutlによるTSエンコード入門~準備編~
http://coelacanth-deepsea.hatenablog.com/entry/2012/10/26/231233

aviutlによるTSエンコード入門~番外編~
http://coelacanth-deepsea.hatenablog.com/entry/2012/11/02/011821

ファイル名によるバッチファイル処理失敗の回避の方法
http://coelacanth-deepsea.hatenablog.com/entry/2013/01/13/160853

aviutlによるTSエンコード入門~バッチファイル編(DGIndex)~
http://coelacanth-deepsea.hatenablog.com/entry/2013/01/13/160853 

さて、前回の記事で準備は完了したはずということで、バッチファイルの準備に移りたいと思います。正常に動作しない場合は、私が必要なファイルを挙げ忘れているためだと思いますので、コメント等で知らせて頂ければ幸いです。

バッチファイル載せて終わりにしてもいいのですが、こんな情報を漁りに来る人間は最終的に自分でカスタマイズできないと満足できない性質のはず!ということで、バッチファイルの基本から説明したいと思います。

バッチファイルによる半自動化の内容

  1. ソースファイル(ts)をBonTsDemuxを使って動画(m2v)と音声(aac)に分離
  2. 音声(aac)ファイルをToWaveを使って、wav変換+delay修正
  3. mmeを使って動画(m2v)ファイルからGOPリストの作成
  4. aviutlに動画ファイル(m2v)+GOPリスト(gl)と音声ファイル(wav)を読みこませる

なお、本パッチを作成するにあたり参考にしたサイトは以下の通りです。

http://heieiei-islands.blog.so-net.ne.jp/2012-01-10

 

バッチファイルの作成にあたっては、基礎文法くらいは把握しておく必要があります。事前準備として下記サイトに目を通しておいてください。

http://kshibamo.web.fc2.com/

 

次にワタシの作成した拙いバッチファイル本文です。テキストファイルにコピペ、◯◯◯.batと名前をつけて保存しましょう。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

@echo off
REM ■■取り扱い説明■■
REM TSファイルをこのbatにD&Dする(複数可)
REM TSファイルをBonTsDemuxにてm2vとaacに分割。
REM aacをFAWにてwav変換+delay修正。
REM m2v動画ファイルとaac音声ファイルをAviutlに読み込ませ、
REM 指定したプロファイルで起動する
REM *******************************************************
REM FAW、BonTsDemux、Aviutl、Aviutlcontrol(AUC)
set TOWAVE="~~~~\ToWave.exe"
set TSDEMUX="~~~~\BonTsDemux.exe"
set AVU="~~~~\aviutl.exe"
set AUC_DIR=~~~~\auc\
set MME="~~~~\mme.exe"
 
REM Aviutlのプロファイルを指定する。プロファイル番号は上から0,1,2……
set UTL_PROF=1
REM 0=ドラマ(例)
REM 1=1080i 16:9 映画(例)
REM 2=アニメそんなバナナ(例) 
REM 出力先を指定する。指定がなければTSファイルがあるフォルダに出力する。

set OUTPUT=
REM ****************************************************
 
echo Aviutlプロファイル %UTL_PROF%
if exist "%OUTPUT%" (
    echo %OUTPUT%に出力します
) else (
    echo 元のフォルダに出力します
    set OUTPUT=%~dp1
    )
 
:start
IF "%~1"=="" GOTO END
IF NOT "%~x1" == ".ts"  GOTO shiftprocess
 
set PATH_NAME=%~dp1
set OUTPUT_NAME=%~n1
 
echo.
echo ****************************************************
echo.
echo "%OUTPUT_NAME%"の
echo 分離作業開始
echo.
echo ****************************************************
echo.
 
echo "BonTsDemux"
%TSDEMUX% -i "%~1" -o "%OUTPUT_NAME%" -encode "Demux(m2v+aac)" -nogui -nd -start -quit
for /f "usebackq tokens=*" %%i in (`dir /b "%PATH_NAME%%OUTPUT_NAME%.m2v"`) do set M2V_FILE=%%i
if not exist "%M2V_FILE%" (
    echo "%OUTPUT_NAME%"をm2v+acc分離できませんでした
    GOTO error0
) else ( 
    echo "m2v+acc分離OK"
    )
 
set M2V_FILE_NAME=%M2V_FILE:~0,-4%

echo "ToWave"
for /f "usebackq tokens=*" %%i in (`dir /b "%M2V_FILE_NAME%*DELAY*.aac"`) do set AAC_FILE=%%i
if not exist "%AAC_FILE%" (
    echo "%OUTPUT_NAME%"のAACファイルがありません
    GOTO error1
)
%TOWAVE% "%AAC_FILE%"
for /f "usebackq tokens=*" %%i in (`dir /b "%M2V_FILE_NAME%*.wav"`) do set WAV_FILE=%%i
if not exist "%WAV_FILE%" (
    echo "%OUTPUT_NAME%"のAACをWAV変換できませんでした
    GOTO error2
) else ( 
    echo "WAV変換完了"
    del "%AAC_FILE%"
    )
 
echo "Make gl file"

%MME% -g -q "%M2V_FILE%"
 
echo.
echo ****************************************************
echo.
echo "%OUTPUT_NAME%"の
echo m2v + aac + glの生成に成功しました
echo.
echo ****************************************************
echo.
 
SHIFT
IF NOT "%~1"=="" GOTO NEXT1
 
echo "Start Aviutl"
 
start /b "" %AVU%
timeout -t 2
echo "%M2V_FILE%"
echo "add m2v file"
call "%AUC_DIR%auc_open" "%M2V_FILE%"
timeout -t 3
 
echo "add WAV file"
call "%AUC_DIR%auc_audioadd" "%WAV_FILE%"
timeout /t 3
 
echo "set encode profile"
call "%AUC_DIR%auc_setprof" "%UTL_PROF%"
timeout /t 3
 
rem echo "Make mp4 file"
rem call "%AUC_DIR%auc_plugout" "1"  "%OUTPUT%%OUTPUT_NAME%.mp4"
rem timeout /t 5

rem "%AUC_DIR%\auc_wait"
rem timeout /t 5
 
echo.
echo ****************************************************
echo 現在『aviutl』には
echo "%OUTPUT_NAME%"の
echo m2v + aac が読み込まれています
echo ****************************************************
echo.
 
GOTO END
 
:error1
del "%M2V_FILE%"
:error2
del "%AAC_FILE%"
:error0
echo ****************************************************
echo エラー終了しました
echo ****************************************************
pause
exit
 
:shiftprocess
SHIFT
:NEXT1
echo 次のファイルへ移ります
GOTO start
 
:END
echo 全作業が終了しました
pause
exit

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

さて解説に移ります。

┃@echo off
┃ REM ■■取り扱い説明■■

「echo」コマンドプロンプトのコンソール上にメッセージを表示するためのコマンドです。echo + 半角スペース+メッセージと記述します。ちなみに「echo.」は空文字の表示です。「@echo off 」はコンソール上に処理メッセージが表示されるのを防ぐための慣用句です。プログラムの冒頭に記述しましょう。

┃REM FAW、BonTsDemux、Aviutl、Aviutlcontrol(AUC)
┃set TOWAVE="~~~~\ToWave.exe"
┃set TSDEMUX="~~~~\BonTsDemux.exe"
┃set AVU="~~~~\aviutl.exe"
┃set AUC_DIR=~~~~\auc\
┃set MME="~~~~\mme.exe"

set で変数の宣言を行い、そこにプログラムまでのpathを格納しています。たとえば変数のTO WAVEにはToWave.exeまでのフルパスを格納する必要があります。ご自身の環境に合わせて~~~~の部分をパスで置き換えて下さい。各々の変数について同様の作業を行なって下さい。
"◯◯◯◯"ダブルクオーテーション(")に囲まれた領域は、連続した文字列として
プロンプトに処理されます。プロンプトでは文字列中に半角や全角スペースを含む場合、文字列が分割される場合がありますので、その防止策として有効です(→訂正)。ご自身の環境下で上記バッチを実行し、auc周りにエラーが出た場合はAUC_DIRのパスをダブルクオーテーションで囲むことで改善されるかもしれません。

┃REM Aviutlのプロファイルを指定する。プロファイル番号は上から0,1,2……
┃set UTL_PROF=1
┃REM 0=ドラマ(例)
┃REM 1=1080i 16:9 映画(例)
┃REM 2=アニメそんなバナナ(例)

プロファイルは、aviutlを起動してソースに応じた設定を事前に保存しておく必要があります。ということは作品ごとにUTL_PROFを書き換えなくてはいけないわけで、複数のソースを処理する場合には現状において無用の長物なのです\(^o^)/

┃REM 出力先を指定する。指定がなければTSファイルがあるフォルダに出力する。
┃set OUTPUT=

エンコまで一気に処理したい人はOUTPUTにフルパスを通してください。

┃echo Aviutlプロファイル %UTL_PROF%
┃if exist "%OUTPUT%" (
┃    echo %OUTPUT%に出力します
┃) else (
┃    echo 元のフォルダに出力します
┃    set OUTPUT=%~dp1
┃    )

変数を%で挟むことで値を参照しています。%UTL_PROF%の部分はコンソール上で1と表示されるはずです。次にif条件分岐です。if 条件 ( [コマンド1] ) else ( [コマンド2] ) の構文です。条件が満たされた場合(真の場合)はコマンド1が、そうでない場合はコマンド2が処理されます。上記のexist場合、%OUTPUT%内に何かしらのデータが格納されているかを分岐の条件としています。コマンド2の格納されていない場合には、新たにOUTPUT「%~dp1を代入しています。「%~dp1については次で詳述しますが、ここではソースファイルのあるディレクトリへのパスを受渡していると理解してください。

┃ :start
┃IF "%~1"=="" GOTO END
┃IF NOT "%~x1" == ".ts"  GOTO shiftprocess

さて、「%~1」とは何ぞやということですが、「%1」はバッチパラメータと呼ばれる変数であり、これに変数の参照条件「~」をつけて呼び出しています。バッチ自身は初期状態で10個の格納庫を持っていますが、その1個目が%0で、中にはバッチファイル自身の名前が固定で格納されています。%1、%2・・・、%9には、バッチファイルに複数のソースファイルがドラッグ・アンド・ドロップされた場合に、各ソースファイルのフルパスが順次格納されます。

ここまで理解できれば登山の6合目といったところでしょうか。それでは変数の参照条件について解説しましょう。「%~1」に含まれる「~」は、変数中の引用句(")を削除して参照します。ゴミ取りみたいなものだと思って下さい。プログラムへの引数の引き渡しや条件文中などでよく使います。さらに「~」の後ろに特定のアルファベットを加えることで新たな参照条件を加えることができます。たとえば「%~dp1「d」は%1のドライブ名を、「p」はドライブレターとファイル名を除くパス文字列をそれぞれ呼び出しており、両者を組み合わせることで%1のファイル名を除くドライブからのパス文字列を参照させることができます。もし、TSソースのフルパスが「D:\◯◯◯◯\tsソース\hogehoge.ts」だったならば、「%~dp1 = D:\◯◯◯◯\tsソース\」と参照されるわけです。ちなみに「%~x1」の「x」はファイルの拡張子を参照しています。

「:shiftprocess」は、ラベルと呼ばれるもので、バッチファイル中に「:」の後に適当な文字列を記入することでプログラムソース中にインデックスを与えることができます。「GOTO shiftprocess」では「GOTO」を置くことによって、当該インデックスまで処理をバイパスさせます。

┃set PATH_NAME=%~dp1
┃set OUTPUT_NAME=%~n1

上はTSソースファイルのあるフォルダまでのパスを、下は「n」をつけることでTSソースの拡張子を除くファイル名を格納しています。

┃%TSDEMUX% -i "%~1" -o "%OUTPUT_NAME%" -encode "Demux(m2v+aac)" -nogui -nd -start -quit

コマンドラインによるBonTsDemuxの操作です。本体へのパスが格納された%TSDEMUX%に「"%~1"」(ドラッグ・アンド・ドロップされたTSソース)を渡し、「"%OUTPUT_NAME%" 」のファイル名を指定して動画(m2v)ファイルと音声(aac)ファイルを出力させています。その他の細かなオプションについては、BonTsDemuxのreadme.txtを読んでください。

┃for /f "usebackq tokens=*" %%i in (`dir /b "%PATH_NAME%%OUTPUT_NAME%.m2v"`) do set M2V_FILE=%%i

ここが二つ目の難所でしょうか?機能をざっくり説明すると、先ほど作成した動画(m2v)ファイルのフルパスを変数「M2V_FILE」に格納しています。まず「for /f」は文字列の解析を行うコマンドです。「usebackq」は、後に続く(`◯◯◯`)内が解析対象の文字列そのものではなく、文字列を探すためのコマンドであることを宣言しています。「tokens=*」はファイル名(解析対象の文字列)にスペースや空白が含まれようが、1つの文字列としてみなすよう指示しています。「dir /b △△△.m2v」は△△△.m2vと一致するファイルのフォルダとファイル名を表示するコマンドです。一致するファイルが見つかったら、変数%%i(for構文中の変数表記方法)に渡して、「do set M2V_FILE=%%i」「M2V_FILE」に△△△.m2v(フルパス)を格納しています。

┃set M2V_FILE_NAME=%M2V_FILE:~0,-4%

これは「M2V_FILE」に格納された文字列を先頭(0文字目)から受け取り、後ろ4文字(.m2v)を削除して「M2V_FILE_NAME」に格納しています。もし.tsなら-3になるよ!

┃for /f "usebackq tokens=*" %%i in (`dir /b "%M2V_FILE_NAME%*DELAY*.aac"`) do set AAC_FILE=%%i

これはBonTsDemuxで生成された音声(aac)ファイルのフルパスを、AAC_FILE」に格納しています。音声(aac)ファイルには、生成時に遅延時間などのユニークな変数がファイル名に付記されますので、その不確定な部分を「*」ワイルドカードで記述しています。

┃%TOWAVE% "%AAC_FILE%"

ToWave.exeで音声ファイルのaac⇒wav変換+遅延修正を行なっています。細かいことはToWaveのreadme.txtを参照してください。

┃%MME% -g -q "%M2V_FILE%"

mme.exeでGOPリストを作成しています。あらかじめ作成せずにaviutlに動画(m2v)ファイルを渡すと、処理途中で音声(wav)ファイルを受け取ってしまいエラーが生じます。生成されるリストの拡張子は「.gl」です。

┃SHIFT
┃IF NOT "%~1"=="" GOTO NEXT1

「SHIFT」は、変数%1を%2に順送り、つまり2つ目のソースファイルを参照するよう指示しています。次の行では、処理するソースファイルがまだある場合は、インデックスのNEXT1に進み、つぎの分離作業に移行するよう指示しています。つまり、本バッチファイルでは最後に生成されたm2v+wavファイルのみがaviutlに渡されることになります(´・ω・`)

┃start /b "" %AVU%
┃timeout -t 2
┃echo "%M2V_FILE%"
┃echo "add m2v file"
┃call "%AUC_DIR%auc_open" "%M2V_FILE%"

ここからはAviutlcontrolの制御ですので、詳しくはそちらのreadme.txtを参照してください。まず「start /b "" %AVU%」でaviutlの起動。「timeout -t 2」は2秒待つ。callは引数(%M2V_FILE%)を与えてコマンド(%AUC_DIR%auc_open)を実行しています。

┃rem echo "Make mp4 file"
┃rem call "%AUC_DIR%auc_plugout" "1"  "%OUTPUT%%OUTPUT_NAME%.mp4"
┃rem timeout /t 5

┃rem "%AUC_DIR%\auc_wait"
┃rem timeout /t 5

エンコまで自動化するつもりはないのでコメントアウトしています。お好みでどうぞ。

┃del "%M2V_FILE%"

◯◯◯.m2vファイルを削除しています。

┃pause
┃exit

「pause」で処理を止めます。「exit」でコマンドプロンプトを閉じます。・・・ってひょっとするとこれだと「exit」まで行き着かない?w
ちなみに分離作業以降でエラー吐いたことがないので、構文ミス見逃してるかもしれません。

以上、バッチファイルについてざっくりと説明しました。がんばって書いたつもりですが、意味不明なところや間違っているところ、わからないところがあればコメントに寄せていただければと思います。