†ぽんこつビデオ工房†

カット編集の食い込みの問題

作成開始日 2020.01.21
最終更新日 2020.01.25

mpeg系の動画のフレームにはIフレーム、Pフレーム、Bフレームの三種類があるが、無損失で綺麗にカット編集できるのはIフレーム位置だけであり、Iフレームはほぼ0.5秒ごとにしか出現しない。したがって、カット位置では最大0.5秒/平均0.25秒の誤差(食い込み)が発生する。もし、カット位置が8箇所あれば、平均で8×0.25=2秒ほど本編を削ってしまう。

[CM|オープニング|CM|Aパート|CM|Bパート|CM|予告|CM]

ただし、本編部分の先頭はIフレーム必須だが、末尾はPフレームでも良いので、手間を惜しまなければ、誤差が発生するのは半分の4箇所となり、食い込みも合計で1秒程度に抑えられる。

再エンコするのであればカット位置は自由で、こんな問題は発生しない。ただし、Avidemuxでのエンコードは、速度的にも画質的にも問題が多い。現実的には、Avidemuxは無損失(copy/copy)専用の動画エディタであり、そうであれば、このIフレームによる誤差問題は不可避。

通常、この程度の誤差は許容範囲内で、特に鑑賞の妨げにはならないが、たまに頭の音声や映像にカットが食い込んで、けっこう困ったことになることがある。そのような場合、頭はIフレーム1つ分手前で切って、再エンコの際に起点を指定する。たとえば、0.367秒の位置から本編が始まる場合は;

ffmpeg -ss 0.367 -i 01.avi 01.mp4
この「-ss」オプションで本編の起点を指定している。ただし、1フレーム単位(約0.033秒)で正確に処理できる訳ではないようだ。この値が極端に小さい場合には、もう1Iフレーム分(約0.5秒)手前で切る方が良い。カブリが1フレーム(0.034秒)のファイルでは、起点指定が正常に機能しなかった。また、avidemux上で確認した起点と、保存ファイルの起点にも多少の誤差が生ずる。細かなことを言い出すと、けっこう面倒臭い。

なお、ファイルごとに誤差は不定であるため、一括処理は困難(工夫の余地はある)。また、この方法は本編ド頭にしか使えない。Bパートの先頭など、中途半端な場所で同様な問題が発生すると対処不可能。ffmpeg4(q0)等に変換すれば、Iフレーム位置・出現間隔(gop)を変更することできるが、これは全く逆効果になるリスクもあり、あまり確実な方法ではない。どうしても正確にカットしたければ、パートごとに切り出してエンコードする。原理的には簡単だが、物凄く手間が掛かる;よほどの場合でなければできない。

HDレコーダでカット済みのファイルに関しては、必ずしもファイル先頭が0.000から始まっているわけではないようだ。ファイル先頭が0.268秒で、本編先頭が0.635秒からと言うこともある。この場合も-ssは0.635を指定すべきで、差の0.635-0.268=0.367ではない。

●一括処理の工夫の例

起点の情報をファイル名に持たせてバッチ処理する。たとえば;

  12-568.avi…第12話のファイルで起点は0.568秒とする

の要領でファイル名を付けておけば、以下のバッチで一括処理可能。

@echo off
setlocal enabledelayedexpansion

for %%f in (*.avi) do (
set fname=%%~nf
set ss=!fname:~3,3!
if not "!ss!"=="" (ffmpeg -ss 0.!ss! -i %%f !fname:~0,2!.mp4)
)

endlocal


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