VOBのチャプター結合
■チャプターごとにリップして、必要部分のみ結合する方法
①DVD Decrypterでリップする際、IFOモードでチャプターごとに分割を選ぶ。
②VOBEditでチャプターを連結する準備として必要部分のVOBファイルを連番化する。
ファイル名を「VTS_01_001.VOB」のようにVTS_01_***.VOBの部分を3桁の数字で連番化
③VOBEditで連番ファイルを結合する。VOBEditで先頭のファイル「VTS_01_001.VOB」をOPEN。
続いてファイルメニューの「Edit」→「Join Clips」で次のファイルを選択。
「OK」を押すと結合が始まり「VTS_01_1.VOB」のファイル名で結合ファイルが生成される。
④VOBEditが生成する結合ファイルは1Gが上限で、それより大きいと「VTS_01_2.VOB~」
に分割される。これらは単純にファイル連結すればよい。(バイナリモード /Bの指定が必要)
copy /B VTS_01_1.VOB+VTS_01_2.VOB+VTS_01_3.VOB out.VOB
または
copy /B VTS_01_* out.VOB (他のVTS_01_*を退避しておく必要あり)
※連番ファイルのリネーム.bat
set n=1000
for %%f in (VTS_01_*.VOB) do (
call :rename %%f
)
pause
goto :EOF
:rename
set /a n+=1
set i=%n:~-3:3%
ren %1 VTS_01_00%i%.VOB
:EOF
[解説]
forループでファイルセットからひとつずつ取り出して名前を変えていけばよいが
問題が3つ
①連番の番号をどのように作り出すか?
②連番の桁数をゼロで埋める書式をどのように作り出すか?
③forループ内の遅延展開の問題
①については連番用の環境変数を用意しておく。
set n=1
setコマンドは/A オプションで演算処理が行える。インクリメントは「+=」
set /A n+=1
②C言語のような書式付出力がないので、初期値を1000としてインクリメントし、
おしりから3桁を取り出す方法が定石のよう。
%n:~-3:3% が環境変数nの持つ文字列の後ろから三文字目(-3)の位置から3文字
を取り出す書式になる。
③普通に考えれば
set n=1000
for %%f in (VTS_01_*.VOB) do (
set /A n+=1
:/* n="1001"のおしり3文字目から3文字分を取り出す i="001" */
set i=%n:~-3:3%
ren %%f VTS_01_%i%.VOB
)
でいけそうだが、これだと上手くいかない。
forループ内では環境変数の変更ができないような決まりになっているため。
これを回避するために、callコマンドを使って外部のバッチ処理を呼び出す
方法をとる。
call :ラベル %%引数
により、同じバッチファイル内で外部バッチを呼び出すのと同じ意味になる。
=サブルーチンの呼び出し
call :rename %%f
により、ラベル以下の処理に%%fを引数として渡している。
受け取ったサブルーチンでは%1に%%fを取り込んでいるので
ren %1 VTS_01_00%i%.VOB
でリネーム処理が行われることになる。
またサブルーチン内ではsetコマンドによる変数の変更が行えるので
set i=%n:~-3:3%
set /A n+=1
が望み通りに機能するようになる。
最後に、ループを抜けた後でラベル以降の部分を2重に実行してしまうのを
防ぐためにgoto文で:EOFに飛んで実行を回避。(※EOFは予約語で暗黙的に
ファイル終端に飛んでくれる模様)
①DVD Decrypterでリップする際、IFOモードでチャプターごとに分割を選ぶ。
②VOBEditでチャプターを連結する準備として必要部分のVOBファイルを連番化する。
ファイル名を「VTS_01_001.VOB」のようにVTS_01_***.VOBの部分を3桁の数字で連番化
③VOBEditで連番ファイルを結合する。VOBEditで先頭のファイル「VTS_01_001.VOB」をOPEN。
続いてファイルメニューの「Edit」→「Join Clips」で次のファイルを選択。
「OK」を押すと結合が始まり「VTS_01_1.VOB」のファイル名で結合ファイルが生成される。
④VOBEditが生成する結合ファイルは1Gが上限で、それより大きいと「VTS_01_2.VOB~」
に分割される。これらは単純にファイル連結すればよい。(バイナリモード /Bの指定が必要)
copy /B VTS_01_1.VOB+VTS_01_2.VOB+VTS_01_3.VOB out.VOB
または
copy /B VTS_01_* out.VOB (他のVTS_01_*を退避しておく必要あり)
※連番ファイルのリネーム.bat
set n=1000
for %%f in (VTS_01_*.VOB) do (
call :rename %%f
)
pause
goto :EOF
:rename
set /a n+=1
set i=%n:~-3:3%
ren %1 VTS_01_00%i%.VOB
:EOF
[解説]
forループでファイルセットからひとつずつ取り出して名前を変えていけばよいが
問題が3つ
①連番の番号をどのように作り出すか?
②連番の桁数をゼロで埋める書式をどのように作り出すか?
③forループ内の遅延展開の問題
①については連番用の環境変数を用意しておく。
set n=1
setコマンドは/A オプションで演算処理が行える。インクリメントは「+=」
set /A n+=1
②C言語のような書式付出力がないので、初期値を1000としてインクリメントし、
おしりから3桁を取り出す方法が定石のよう。
%n:~-3:3% が環境変数nの持つ文字列の後ろから三文字目(-3)の位置から3文字
を取り出す書式になる。
③普通に考えれば
set n=1000
for %%f in (VTS_01_*.VOB) do (
set /A n+=1
:/* n="1001"のおしり3文字目から3文字分を取り出す i="001" */
set i=%n:~-3:3%
ren %%f VTS_01_%i%.VOB
)
でいけそうだが、これだと上手くいかない。
forループ内では環境変数の変更ができないような決まりになっているため。
これを回避するために、callコマンドを使って外部のバッチ処理を呼び出す
方法をとる。
call :ラベル %%引数
により、同じバッチファイル内で外部バッチを呼び出すのと同じ意味になる。
=サブルーチンの呼び出し
call :rename %%f
により、ラベル以下の処理に%%fを引数として渡している。
受け取ったサブルーチンでは%1に%%fを取り込んでいるので
ren %1 VTS_01_00%i%.VOB
でリネーム処理が行われることになる。
またサブルーチン内ではsetコマンドによる変数の変更が行えるので
set i=%n:~-3:3%
set /A n+=1
が望み通りに機能するようになる。
最後に、ループを抜けた後でラベル以降の部分を2重に実行してしまうのを
防ぐためにgoto文で:EOFに飛んで実行を回避。(※EOFは予約語で暗黙的に
ファイル終端に飛んでくれる模様)