†ぽんこつビデオ工房†
作成開始日 2020.01.21
最終更新日 2020.01.25
再エンコするのであればカット位置は自由で、こんな問題は発生しない。ただし、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