†ぽんこつビデオ工房†
作成開始日 2022.12.25
最終更新日 2022.12.25
無損失原盤の処理方法の基本原理は既に【別項】で述べた。しかし、この方法は手作業による工程が多く非常に面倒臭い。そこで、少し効率化する方法を考案した。基本的には、Avidemuxの編集点ファイル(pyプロジェクトファイル)を参照して各パートを切り出し、微調整を加えた後に結合すると言う方法。厄介なのは、avidemuxとffmpegの相性の悪さ。両方のツールを併用せざるを得ないのだが、普通に使用すると、無視できない誤差が発生してしまう。そこで…
30分番組は、たいてい番組本体が24分、番組中CMが3分、番組後CMが3分くらいの按分。無編集で原盤として保存しても良いのだが、番組本体だけ取り出せればサイズが8割に減る。これは保存の際にけっこう大きな差になる。
番組後CMを削除するだけならば処理は単純で、サイズも9割になる。しかも、番組中CMは必ずしも不要とは限らない。考慮に値する。ただし、ffmpegでお尻のCMを切って、avidemux_cliで素通し変換を掛けるとファイルが壊れるので…⇒【こっち】
@編集したい動画ファイル(.VRO)をavidmux_cliで素通しAVI変換する。下記のようなバッチAVCL.BATを作成して、「avcl *.vro[Enter]」とすれば簡単。@REM ***** AVCL.BAT -- AviDemux Command Line ***** @for %%f in (%1) Do @( "C:\Program Files\Avidemux 2.6 - 64bits\avidemux_cli" ^ --load %%f --video-codec COPY --audio-codec COPY --nogui --save %%~nf.avi )
A素通しavi変換したファイルをAvidemux 2.6.8で読み込んで編集(CMカット)する。
B編集が済んだら、ツールバーにある[Save Project]アイコンをクリックして、プロジェクトファイル(.py)を保存する。ここでは、動画ファイル名を「05.avi」とすれば、プロジェクトファイル名は「05.py」のようにする。
Cカレントディレクトリに「genban」というサブディレクトリを作成しておく。
D次のようなPerlスクリプトを実行する。この処理が今回のキモで、ffmpegとAvidemuxの誤差を吸収するために、切り出し位置の末尾に0.07秒の補正を加えている。これによって、編集点に僅かな食い込みが生じるが、補正をしないとCMの残滓(1フレーム)が残ってしまうことがある。ちなみに、この処理によって、24分4パート構成番組で合計0.3秒ほどの欠損が発生する。現状では、ここは目をつぶるしかない。
なお、先頭位置も直近のIフレーム位置に丸められるため、0〜0.6秒くらいのCM残滓が付くが、これは後述の方法で除去する。
#pick2.pl #無損失原盤用の切り出しプログラム #切り出し範囲の末尾位置には0.07秒の補正を加えている my @py=glob('*.py'); my $fname; my $st; my $p,$q,$r; my $top,$bot; my $fbat; open my $fbat, '>', 'build.bat'; foreach(@py){ $st=$_; print "$st \n"; $p=index($st,'.'); $fname=substr($st,0,$p); open my $fp , '<', $fname.'.py'; print $fbat "del _?.avi \n"; $n=0; while ($st = readline $fp){ chomp $st; if (index($st,'addSegment')>=0) { $n=$n+1; print "$n : $st \n"; $p=index($st,' '); $q=rindex($st,' '); $r=index($st,')'); $top=substr($st,$p+1,$q-$p-2)/1000000; $bot=substr($st,$q+1,$r-$q)/1000000-0.07; #0.07は補正値(2フレーム分) print $fbat "ffmpeg -ss $top -i $fname.avi -t $bot -c copy genban\\".$fname.chr($n+96)."-.avi \n"; } }; #print $fbat "ffmpeg -f concat -i $fname.lst -c copy "; #print $fbat " -aspect 4:3 "; #print $fbat " -aspect 16:9 "; #print $fbat "genban\\$fname.avi \n"; #print $fbat "del _?.avi \n"; close $fp; close $flist; }; print $fbat "echo \n"; close $fbat;
E上記のスクリプトを実行すると、カレントディレクトリに「build.bat」というバッチファイルが作成されるので、これを実行する(引数は不要)。
F先程作成した「genban」ディレクトリに、「05a-.avi」「05b-.avi」…などのファイルが作成されるので、一つずつAvidemuxで開いて、先頭のCM残滓位置を確認し、ファイル名を変更する。たとえば、0.367秒位置から本編が始まっている場合は「05a-367.avi」などのように、開始位置をファイル名に反映させる。
Gファイル名をすべて変更したら、カレントディレクトリを「genban」に移動して、次のようなバッチを実行する。これで、CMを奇麗にカットしたmp4/h.264ファイルが作成される。素通しaviを切り出した元ファイルは、ファイル名のディレクトリの中に移動される(先程の「05a-367.avi」など)。
@rem ***** build2.bat ***** @echo off setlocal enabledelayedexpansion set mm=9999 for %%g in (*.avi) do ( set fname=%%g set nn=!fname:~0,2! @REM ***** 話数判別 ***** if not "!nn!"=="!mm!" ( echo ***** !nn! ***** @del nn.lst 2> nul for %%f in (!nn!*.avi) do ( set finp=%%f @REM ***** ファイル名の本体部分とオフセットの切り出し ***** for /f "usebackq tokens=1-3 delims=-." %%a in ('!finp!') do ( set body=%%a if not "%%c" == "" (set ss=%%b) else (set ss=0) ) set fout=!body!.mp4 echo ===== out : !fout! !ss! echo file !fout! >> nn.lst @REM ***** 部分ファイルの個別変換 ***** if "!ss!" == "0" (echo ***** offset missing ***** & exit /b) ffmpeg -ss 0.!ss! -i !finp! !opt! !fout! ) @REM ***** 部分ファイルの1話バインド ***** set out=!nn!.mp4 ffmpeg -f concat -i nn.lst -c copy !out! @REM ***** 原盤ファイルをディレクトリにまとめる ***** set gdir=!nn! md !gdir! echo ===== make dir : !gdir! ===== move !nn!*.avi !gdir! ) set mm=!nn! ) endlocal echo exit /b @del nn.lst 2> nul for %%f in (*.avi) do ( set finp=%%f echo ***** inp : !finp! for /f "usebackq tokens=1-3 delims=-." %%a in ('!finp!') do ( set body=%%a if not "%%c" == "" (set ss=%%b) else (set ss=0) ) set fout=!body!.mp4 echo ***** out : !fout! !ss! echo file !fout! >> nn.lst if "!ss!" == "0" (echo *** offset missing *** & exit /b) ^ else (echo @@@@@ ffmpeg -ss 0.!ss! -i !finp! !opt! !fout! ffmpeg -ss 0.!ss! -i !finp! !opt! !fout!) ) set out=!finp:~0,2!.mp4 ffmpeg -f concat -i nn.lst -c copy !out! set gdir=!finp:~0,2! md !gdir! echo *** make dir : !gdir! *** move *.avi !gdir! echo exit /b endlocal