2014年11月29日土曜日

アナログ放送のDVDをmp4エンコして整理してみる

ご無沙汰しております。謎の七面鳥です。

唐突にHandBrakeなるmp4エンコーダが使い勝手がよく、今更ながら気に入ったので、
色々いじっているところです。

特にコマンドラインから扱えるのがよく、今回はこれでバッチファイルなど組んでみましたので、
紹介しようと思います。

目的としては、ほぼ全自動で
①ディスクごとにフォルダを作成し、そこにディスクの内容を保存する
②DVD起動時のタイトルリストをサムネイルとして保存する(半自動)
③DVDに収録されてるトラックを1つずつmp4ファイルとして保存する

これを延々繰り返します。

必要なツールは下記のとおりです。
・HandBrake
 https://handbrake.fr/
 http://sourceforge.jp/projects/handbrake-jp/wiki/FrontPage
 上は本家、下は日本語プロジェクトのページです。
 本家ではメジャーリリースが出ていますので、こちらの方が使い勝手はいいのでは
 ないでしょうか。
 コマンドライン版(CLI)単体のほかGUI版もありますが、こちらにもコマンドライン版が
 同梱されていますので、GUI版での入手をお勧めします。

・Media Player Classic - Home Cinema
 http://sourceforge.jp/projects/sfnet_mpc-hc/
 ディスクのIFOを呼び出すのに使います。
 起動したら手動で「Alt+I」で画像を保存して終了してください。この際ファイル名は
 特に決めずそのまま保存してください。バッチ内でフォルダ・ファイル名を揃えます。
 
 ディスクのサムネイルが不要なら、起動しないようにバッチを修正して使ってください。
 ただ、番組情報等を得るのはここぐらいしかありませんので、あった方が後々整理に
 役立つと思います。 

 ちなみに、IFOの画面を自動でpngにしてくれるツールとかどこかにありませんか…。

・QuickEject
 http://www.tsware.jp/download/qejct/
 あってもなくても動作します。
 ある場合はディスク全体のエンコードが終了したらディスクを自動でイジェクトします。


上記を用意できましたら、適当にインストールします。
バッチファイルは下記をnotepadなどに貼り付けて、拡張子を.batにして保存してください。
一応ウチではDVD2MP4.batなどとしています。

@echo off
goto junbi

流れ
①最初だけプロンプトを出し、ディスクをセットする。
*diskdrv: ディスクのドライブ名 ※「:」付けない
*savedrv: 保存フォルダのドライブ ※「:」付けない
*savepath: 保存フォルダのパス ※指定したドライブ・パスの下位に年月日時分でフォルダ作成
*loop: 1周目か2周目以降かの判定。初回のみMPC-HC.exe起動前に説明文を表示するが、2周目以降はいきなり起動させる。
*makeyn: 保存フォルダが無かった場合、作成の賛否を問う

②ディスク内の\VIDEO_TS\VIDEO_TS.IFOのタイムスタンプを取得し、保存フォルダを作成する。
*vidtsifo: VIDEO_TS\VIDEO_TS.IFO
*Dcode: YYMMDD-HHMM。ディスクごとのフォルダ名・ファイル名として機能する。
*Dcodeopt: 適当。番組名を書くといいかも。無くてもいい。Dcodeの後ろに付く。

③ディスク内の\VIDEO_TS\VIDEO_TS.IFOをMPC-HCで表示→手動でAlt+Iで画像をpngで保存(最初の保存時にpngを選択)
 (保存フォルダは%savepath%になるようにする)→手動で終了。
*showIFO: MPC-HCに相当する実行ファイルのファイル名
*showIFOpath: MPC-HCに相当する実行ファイルのパス
*IFOsumext: IFOサムネイルを保存する拡張子

④VOBを順次mp4にHandBrakeで変換し、設定パス以下の保存フォルダに保存していく。
*encorder: HandBrakeに相当する実行ファイルのファイル名
*encorderpath: HandBrakeに相当する実行ファイルのパス
*encorderopt: HandBrakeに相当する実行ファイルのオプション

⑥終了、先頭に戻る。


:junbi

rem ドライブ・保存フォルダの設定
set diskdrv=Q
set savedrv=E
set savepath=DVDtoMP4
set makeyn=
set loop=
set Dcodeopt=マジカルアニメ・バングミ=メイ

rem エンコーダのexeファイル名とパスの設定
rem ファイル名は空白厳禁。パス空白はドライブルートになる。当バッチと同じフォルダに入れる場合はパスを「.」(半角ピリオド)にする。
set encorder=HandbrakeCLI.exe
set encorderpath=E:\ols\Handbrake
rem set encorderpath=.
set encorderopt=

rem ディスクリスト表示のexeファイル名とパスの設定
rem ファイル名は空白厳禁。パス空白はドライブルートになる。当バッチと同じフォルダに入れる場合はパスを「.」(半角ピリオド)にする。
set showIFO=mpc-hc.exe
set showIFOpath=E:\ols\MPC-HC
rem set showIFOpath=.
set vidtsifo=VIDEO_TS\VIDEO_TS.IFO
set IFOsumext=png

rem イジェクトツールのexeファイル名とパスの設定
rem 使う場合以外はこのままで。空白厳禁。パス空白はドライブルートになる。当バッチと同じフォルダに入れる場合はパスを「.」(半角ピリオド)にする。
set ej=QuickEject.exe
set ejpath=E:\ols\qejct
rem set ejpath=.

rem 各ツールの所在を確認
if not exist %encorderpath%\%encorder% goto err0
if not exist %showIFOpath%\%showIFO% goto err0

rem 保存先の有無確認と無い場合の作成を問う
%savedrv%:
cd \
:fldrchk
if exist %savepath% goto main
set /p makeyn="保存フォルダが見つかりませんでした。作成しますか?(y/n)"
if %makeyn% == "n" goto err1
mkdir %savepath%
goto fldrchk



rem ------------- Start of Main Routine

:main

rem ディスク挿入判定
if not exist %diskdrv%:\%vidtsifo% goto main

rem VTS_01_0.IFOからタイムスタンプを取得してフォルダを作る
for %%a in ( %diskdrv%:\%vidtsifo% ) do set fdate=%%~ta
set ftime=%fdate:~-5%
set fdate=%fdate:~0,10%

set ftime=%ftime::=%
set fdate=%fdate:/=%

set Dcode=%fdate%-%ftime%%Dcodeopt%

%savedrv%:
cd %savepath%
if not exist "%Dcode%" md %Dcode%
rem フォルダ作成に失敗したらエラーに飛ぶ
if not exist "%Dcode%" goto err2

rem IFOファイルのスクショを取得
if not "%loop%" == "" goto gThumbIFO

echo 取り込むDVDを入れてください。
echo %showIFO% を起動しますので起動後にAlt+Iで画像を %IFOsumext% 形式で保存してください。
echo 何かキーを押すと %showIFO% が起動します...
echo;
echo;
echo;
set /p null=""

:gThumbIFO
%showIFOpath%\%showIFO% %diskdrv%:\%vidtsifo%
if errorlevel 1 goto err3
move *.%IFOsumext% "%Dcode%\%Dcode%.%IFOsumext%"
set loop=1

rem HandBrakeCLI.exeでエンコード
:HB
for /L %%n in ( 1, 1, 9 ) do if exist %diskdrv%:\VIDEO_TS\VTS_0%%n_0.IFO %encorderpath%\%encorder% -i "%diskdrv%:\\" -t %%n -o "%Dcode%\%Dcode%-0%%n.mp4" -markers="%Dcode%\%Dcode%-0%%n.csv" %encorderopt%
if not exist %diskdrv%:\VIDEO_TS\VTS_10_1.VOB goto ej
for /L %%n in ( 10, 1, 99 ) do if exist %diskdrv%:\VIDEO_TS\VTS_%%n_0.IFO %encorderpath%\%encorder% -i "%diskdrv%:\\" -t %%n -o "%Dcode%\%Dcode%-%%n.mp4" -markers="%Dcode%\%Dcode%-%%n.csv" %encorderopt%

:ej
rem QuickEjectがあればドライブをイジェクト

if not exist %ejpath%\%ej% echo ディスクを入れ替えて、何かキーを押してください...
if exist %ejpath%\%ej% echo ディスクを入れ替えてください...
echo;
echo;
echo;
if not exist %ejpath%\%ej% set /p null=""
if exist %ejpath%\%ej% %ejpath%\%ej% %diskdrv%
goto main

rem ------------- End of Main Routine

rem エラーメッセージ

:err0
if not exist %encorderpath%\%encorder% echo "err0:%encorderpath% の %encorder% が見つかりませんでした。"
if not exist %showIFOpath%\%showIFO% echo "err0:%showIFOpath% の %showIFO% が見つかりませんでした。"
goto end

:err1
echo "err1:保存フォルダ %savedrv%:\%savepath% が見つからなかったため、終了します。"
goto end

:err2
echo err2:ディスクの保存フォルダ %savedrv%:\%savepath%\%Dcode% を作成できなかったため、終了します。
goto end

:err3
echo err3:%showIFO% が異常終了したため、バッチを終了します。
rem goto end
:end
pause

なお、本バッチファイルの使用に伴う損害等は負いません。
責任は使用されるご自身となります。
改変・転載などはご自由にどうぞ。

各環境に適応させるには、冒頭の環境変数を適宜書き換えてください。

1枚のエンコードに時間がかかる場合は、サムネイルを作成せずに、ISOイメージを作成して、
それをバッチで処理していく方が手間がかからないかもしれません。

また応用として、番組ごとに開始・終了時間をオプションでセットさせれば、前後のCMカットを
自動でやってくれます。
その辺りはHandBrakeの使用法を検索して見つけてください。
またオプションは、一度GUI版で最適なパラメータを見つけてから、ログファイルにあるオプションを
こちらのバッチに記載する方がいいと思います。

貴方のライブラリの整理の一助になれば幸いです。