ffmpegで再エンコードして動画のサイズを減らす

万能?な動画・音声・画像変換ツールとして知られる、ffmpegコマンドの使い方について少し調べたので、とりあえず再エンコで動画のサイズを減らす方法について書いてみる。

H.265

H.265 - Wikipedia
持っている動画ファイルのコーデックがH.264、もしくはそれより古いコーデックを使っている場合、新しいコーデックに変換すれば、ファイルサイズを劇的に減らせるかもしれない。
※オプションの順番にも意味があるので、安易に入れ替えてはいけない。

画質にこだわりたい場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 22 -preset superfast (出力ファイル名)

そこまで画質にこだわらない場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 28 -preset superfast (出力ファイル名)

画質を犠牲にしてもサイズを小さくしたい場合

ffmpeg -i (入力ファイル名) -c:v libx265 -c:a copy -crf 33 -preset slow(出力ファイル名)

元の動画が古い場合は、H.264に変換するだけでサイズをかなり小さくできるかも

ffmpeg -i (入力ファイル名) -c:v libx264 -c:a copy -crf 18 -preset medium(出力ファイル名)

※動画フォーマットは拡張子から自動で判定される

  • -c:v libx265 : 動画コーデックを選択(libx265はH.265、libx264はH.264のコーデック)
  • -c:a copy : 音声は再エンコードしない(再エンコードしてもサイズは大して減らないので)
  • crf 〇〇 -preset 〇〇 のところで、パラメーターをいじって設定を変えられる。
  • -crf : 動画の質、クオリティを決める。デフォルトの数字は28(選択範囲は0~51。数字が小さいほうが質が高い)。劣化を気にしないならもっと数字を大きくしてもよい。もちろん、数字が小さいほどファイルサイズは増え、処理にも時間がかかる。

H.265の場合、crfの数字は、動画の質にこだわりたい場合でも、最高でも20くらいで十分。ほとんどの場合、20~35の間から選べば良い(多分)。
H.264の場合のデフォルトは23。18〜28が推奨されている(https://trac.ffmpeg.org/wiki/Encode/H.264#crf)

  • preset : 圧縮効率。ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow,の中から選ぶ。これは速度とファイルサイズのトレードオフを決めるオプションであって、動画自体の質にはほぼ影響しない。動画のクオリティは前述のcrfの数字で決定される。

ffmpegは非常に多機能なので、他にも色々と設定できるけど、マニア以外はこれだけ設定すれば良さそう)。

とりあえず一部だけ切り出して、試してみると良いと思う。

//動画の最初の一分だけ切り出して再エンコード
ffmpeg -ss 00:00:00 -t 00:01:00 -i input.mp4 -c:v libx265 -c:a copy -crf 28 -preset superfast (出力ファイル名)

HandBrake

HandBrake: Open Source Video Transcoder
GUIつきのHandBrakeというツールもある(内部でffmpegを使っている)。こっちを使ってもよい。
設定項目が色々あるが、基本的にはビルトインのプリセットを選ぶだけで良い。


参考:
Encode/H.265 – FFmpeg
ffmpegで動画をH.265エンコードして容量を大幅に節約する - 丁寧に手を抜く
FFmpeg - ArchWiki