†ぽんこつビデオ工房†

無損失原盤の作成

作成開始日 2021.06.09
最終更新日 2021.06.09

CMの入ったmpeg(VRO/VOB)ファイルから、無損失(=無変換)で本編部分のみ抜き出して処理する方法について述べる。ポイントはmpeg系のIフレーム問題。カット位置の先頭はIフレームでないと映像が乱れるため、本編の始まるフレームの直前のIフレームでカットしなければならない。このため、頭に若干(0〜0.5秒)程度のCMの残滓がくっついてしまう。これ自体は回避不可能な問題だが、これを原盤として、視聴用ファイルを作る際にCMの残滓を取り除くことはできる。

●基本的な考え方

原理はそれほど難しくない。ここでは例として、

  [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


【ぽんこつビデオ工房目次】 【ホーム】