AviSynth 編集してエンコードするときにフレームを間引く人は多いと思うが、AviSynth の導入部分で躓く人が多いと思うので手軽に ffmpeg でフレームを間引く方法。ただし固定周期限定なので周期が途中で変わると間引きがうまくいかず再生がガタガタする。
追記 2015年7月15日
現在は decimate フィルタを使うだけで自動で重複フレームを間引いて 4/5 にフレームにするのでこちらのほうが圧倒的におすすめ。
ffmpeg -i in.mp4 -vf yadif=0:-1:1,decimate -acodec copy out.mp4
追記ここまで
Zeranoe FFmpeg - Builds関連記事
エンコ入門 - 第2回 プルダウン | エンコなうffmpeg でインターレース解除本来は 24000/1001fps なのに、動画は 30000/1001fps になっていることが多い日本の公式配信のアニメは、再生するときに重複フレームが有るためにカクカクした感じがどうしてもしてしまう。これを解消するにはそのフレームを間引く必要がある。
動画をフレーム単位で調べるには Windoiws PC ならば、AviUtl を使ってどのフレームが重複しているかを調べることができる。30000/1001fps が 24000/1001fps になるということは、フレーム数を 4/5 にすることになる。そして動画によって重複するフレームの開始フレームが異なるが、そこから5フレーム毎に重複フレームが現れる。
開始5フレーム目が重複するときは、0,1,2,3,4,0,5,6,7,8,0,9 のように0でフレームを間引き、PTS を調整してエンコードする。音声はエンコードする必要がないのでそのままコピーする。動画を可逆圧縮するときは映像エンコーダに Utvideo を使う。
n の計算式の後ろにはバックスラッシュを入れてエスケープする。FFmpeg documentation : : Notes on filtergraph escapingフレーム数を調べるのに便利なファイル。
ffmpeg -f lavfi -i testsrc2=d=10 -vcodec utvideo input.mkv
ffmpeg -i in.mp4 -vf select=(mod(n\,5)),setpts=N/(24000/1001*TB),fps=24000/1001 -acodec copy out.mp4
ffmpeg -i in.mp4 -vf select=(mod(n\,5)),setpts=N/(24000/1001*TB),fps=24000/1001 -vcodec utvideo -acodec copy out.mkv
動画の重複フレームの開始フレームが5の倍数であるとは必ずしもそうでない場合もある。某アニメの場合、2, 3, 7, 8, 12, 13, 17, 18... のフレームが重複している。このフレームを間引くには
n-2 として、間引く開始フレームを2遅らせる。
ffmpeg -i in.mp4 -vf select=(mod(n-2\,5)),setpts=N/(24000/1001*TB),fps=24000/1001 -acodec copy out.mp4
1, 2, 6. 7... が重複する場合は
ffmpeg -i in.mp4 -vf select=(mod(n-1\,5)),setpts=N/(24000/1001*TB),fps=24000/1001 -acodec copy out.mp4
追記 2013/05/08
重複フレームの確認に各フレームを画像で出力して差分を調べることもできる。出力フレームは映像が動いているシーンが最適だが途中からカットする場合は最初のフレームから数えて何番目のどの周期かを確認する。出力する画像の枚数は最初が動いているのならフレームレートの半分程度で良い。
このコマンドは1フレーム目から10フレーム目までを png の連番で出力する。
ffmpeg -i input -vf select=gte(n\,1)*lte(n\,10) -an -vsync 0 img%02d.png
偶数フレームを出力する:select=(mod(n-1\,2)) // 出力フレームは 0, 2, 4...
奇数フレームを出力する:select=(mod(n\,2)) // 出力フレームは 1, 3, 5...
mod などの特殊な計算式は
ffmpeg で使える計算書式 を参照。
select フィルタの使い方は
【ffmpeg】動画から特定フレームを画像で出力する方法 や
FFmpeg documentation を参照。
- 関連記事
-
コメント