丁寧に手を抜く

頑張らない努力

ffmpegで動画をH.265エンコードして容量を大幅に節約する

ffmpeg活用シリーズ2つめ。前回はこちら:

life.craftz.dog

今回はffmpegを使って、動画の画質をできるだけ保ちつつ容量を大幅に削減する方法。

自分はアクションカムのOsmo Pocketを持っていて、旅行などに行った際に動画を撮って遊んでいる。 その手軽さからぽんぽん動画を撮れてしまうんだが、とにかく動画ファイルがかさばって管理に困る。
何も考えずにHDDやクラウドストレージに保存すると、すぐさま容量がいっぱいになってしまう。
思い出として残れば充分でYouTubeなどの動画編集の素材に使うとかでなければ、ちょっと画質が悪くなっても容量が節約できる方がいい。

Osmo Pocketを例に取ると、これで撮影した動画はH.264形式で保存される。 ffmpegを使ってこの動画をH.265形式にエンコードすると、画質をほとんど失わずにだいたい半分以下に圧縮できる。 素晴らしい。

無料ツールのffmpegを使う

ffmpegというのは有名なフリーの動画変換CLIツール。一度知ったら手放せない。 macだったらhomebrewでインストールできる:

brew install ffmpeg

今回の用途では、ffmpeg--enable-libx265フラグが有効化されている必要がある。 homebrewでインストールしたバイナリではデフォルトで有効化されているので心配ない。

H.265へのエンコード方法

H.265はHEVC(High Efficiency Video Coding)とも呼ばれる動画圧縮規格。その圧縮効率の良さは以下のように説明されている:

libx265 can offer around 25–50% bitrate savings compared to H.264 video encoded with libx264, while retaining the same visual quality. These gains will be most pronounced at resolutions of 1080p and higher.

意訳すると:

libx265libx264エンコードしたH.264の動画と比べて、同じ画質を保ちつつだいたい 25–50% のビットレートを節約できる。 これらは1080p以上の画質の動画でもっとも良く発揮できる。

ただし、上記のページに書かれたコマンドをそのまま実行しても、macOSQuickTime Playerでは出力されたファイルを再生できない。
以下のコマンドでファイルをエンコードできる:

ffmpeg -i input.mp4 -c:a copy -c:v libx265 -crf 22 -tag:v hvc1 output.mp4

各パラメータの意味は以下の通り:

  • -c:a copy: オーディオは再コードせずそのままコピーする
  • -c:v libx265: 動画をH.265でエンコードする
  • -tag:v hvc1: FourCCをhvc1に設定する。これでiOSmacOSで再生できるようになる。
  • -crf 22: Constant Rate Factor (CRF)を22に設定する。H.265のデフォルトは28。

この辺のパラメータは以下の記事を参考にした:

aaronk.me

画質は少し失われるが、ほとんど気にならない

実際に上記のパラメータで変換してみた。 変換前の動画の概要:

  • Format: H.264
  • Resolution: 1920 x 1080
  • FPS: 29.97
  • Data size: 975.6 MB

変換後の動画:

  • Format: HEVC (8-bit)
  • Resolution: 1920 x 1080
  • FPS: 29.97
  • Data Size: 312.8 MB (32.0%)

という訳で、サイズは1/3に縮小した。 画質を比較してみよう。

f:id:craftzdog:20191118105556p:plain

若干彩度が落ちたように見えるが、ほぼ気にならない。

-crf 28だと更にサイズは小さくなり、122.9MBになった。 画質もその分悪くなるが、神経質にならなければほとんど気にならない。

これで思う存分Osmo Pocketで撮りまくることができる。 思い出を経済的に優しくどんどん残そう。

ただし、CPUをフルに使う上に時間が結構かかるので、空いた時間とかに回すのがおすすめ。
GPUを使う方法とかありそうだけど、CUDAを使う方法しか見つからなかったのでまた次の機会にでも改めて調べたい。