†ぽんこつビデオ工房†
作成開始日 2021.06.09
最終更新日 2021.06.09
[CM1|本編Aパート|CM2|本編Bパート|CM3]
という構造のファイルを考える。このファイルをAvidemuxで開いて、本編AおよびBパート部分を切り取って無変換(COPY)で保存すれば良い。ただし、前述のIフレーム問題があるので;
[CMカス|本編Aパート]
[CMカス|本編Bパート]
のようになる。ここで「CMカス」は0.5秒以下の長さである(場合によっては0.5秒よりも少し長いこともあるが)。そこで、ffmpegで視聴用ファイルを作成するときに、「-ss」オプションを指定して、各パートの本編の先頭位置からエンコードし、最後にエンコードしたファイルをバインドすればよい。
@mpeg(VRO/VOB)ファイルをmkvに変換する(時間情報のトリム)
AmkvファイルをAvidemuxで開く
Bパートごとに直前のIフレームでファイルを切り出して無変換で保存する
出力コンテナはaviを推奨(音声を無変換で保存するため)
ファイル名はパートごとに「03a.avi」「03b.avi」「03c.avi」のように
末尾に「a,b,c…」を付けてパートを区別する
C保存した各パートのファイルを再度Avidemuxで開いて、本編先頭位置を確認する。
D本編先頭位置をミリ秒単位にして、ファイル名に付け加える
例)Aパートの本編が「0.266秒」から始まっていれば:03a-266.avi
E全てのパートのファイル名に先頭位置情報を付け加えたら、以下のバッチを実行
【注意】先頭位置までは3フレーム(100ms)以上必要。これより短いと誤差が発生する。その場合は、もう一つ前のIフレームでカットすること。
以上で、CMが奇麗にカットされたh.264/mp4ファイルが作成される。原盤はファイル名と同名のサブディレクトリ内に移動する(ファイル名が「03x-xxx.avi」であればサブディレクトリ名は「03」となる)。
@echo off setlocal enabledelayedexpansion @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" (ffmpeg -i !finp! !opt! !fout!) ^ 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