🎞️

ffmpeg を使って MP4 動画ファイルを圧縮する方法

に公開

はじめに

自分は自分が作成したプログラムの紹介動画を Clipchamp というアプリで編集することがあります。

https://clipchamp.com/ja/

ですが Clipchamp では、編集完了後に最終的に生成するる MP4 ファイルの品質とサイズを細かく指定することができません。とくに、品質が落ちてもいいからとにかくガッツリ圧縮してファイルサイズを小さくしたい、ということができません。

そこで、Clipchamp で MP4 ファイルを生成した後、ffmpeg というツールを使って、その MP4 ファイルをトランスコードし、ビットレートを落とすことで品質を調整し、その代わりにファイルサイズを大幅に削減した新たな MP4 ファイルに変換・生成するようにしました。今回は、その方法について共有します。

ffmpeg とは何か?

さて、そもそも ffmpeg とは何でしょう? ffmpeg とは、コマンドラインから実行するプログラムの名前です。

https://ffmpeg.org/

この ffmpeg (ffmpeg コマンド) は、動画や音声ファイルの変換、ストリーミング、フィルタリングといったような、動画データや音声ファイルに対する様々な加工を行なうことができる、無償で利用可能なプログラムです。ターミナル上で、コマンドライン引数にさまざまなオプションを指定することで、その挙動を制御します。

ffmpeg コマンドの入手先やインストール方法は OSごとに異なるため、ここでは詳細を割愛しますが、公式ウェブサイトや各種パッケージマネージャーを通じて簡単に入手・インストールできます。自分は、使っている OS が Windows なので、下記のサイトから "release builds" のセクションにある、ffmpeg-*.*.*-release-full.7z をダウンロードし、その .7z ファイルを展開すると ffmpeg.exe が出てくるのでこれを PATH を通してあるフォルダに配置して使っています。

https://www.gyan.dev/ffmpeg/builds/

ffmpeg で動画を圧縮するコマンド

ffmpeg のコマンドライン引数は非常に多岐にわたりますが、今回の動画圧縮については、以下の記事を参考にしました。

https://qiita.com/CyberRex/items/960bbd0f348ad8dca544

Intel GPU を積んでいる場合

私が実際に利用しているコマンドは、使用している GPU によって少し異なります。というのも、MP4 ファイルをトランスコードなどで再圧縮するには、膨大な計算が必要です。その計算処理時間を短縮するにに GPU によるハードウェアエンコード機能が大変役に立ちます。それで、GPU の種類によって、使用するハードウェアエンコード機能の指定が変わってくるのです。

ということで、まずは Intel の GPU を積んでいる PC の場合のコマンド例を以下に示します。

ffmpeg -i "%1" -b:v 840k -ar 16000 -b:a 72k -c:v h264_qsv -ac 1 "%2"

上記コマンドライン引数における各オプションの意味は以下の通りです。

  • -i "%1": 入力ファイル (%1 は入力ファイルパスを指定するプレースホルダー)。
  • -b:v 840k: 動画のビットレートを 840 kbps に設定します。この値を小さくするほどファイルサイズは小さくなりますが、品質は低下します。
  • -ar 16000: 音声のサンプリングレートを 16000 Hz に設定します。
  • -b:a 72k: 音声のビットレートを 72 kbps に設定します。こちらも値を小さくするほどファイルサイズは小さくなります。
  • -c:v [codec]: 動画のエンコーダーを指定します。h264_qsv は Intel Quick Sync Video、h264_nvenc は NVIDIA NVENC を利用します。
  • -ac 1: 音声をモノラル(1チャンネル)に設定します。
  • "%2": 出力ファイル (%2 は出力ファイルパスを指定するプレースホルダー)。

これらの設定により、圧縮後のビットレートは動画が 840 kbps、音声が 72 kbps となります。

NVIDIA GPU を積んでいる場合

上記の各オプションの説明に既に記載がありますが、NVIDIA の GPU を積んでいる PC でハードウェアエンコードを利用するには -c:vh264_nvenc を指定します (下記例)。

ffmpeg -i "%1" -b:v 840k -ar 16000 -b:a 72k -c:v h264_nvenc -ac 1 "%2"

圧縮効果は絶大!

この設定を適用することで、だいたい 元のファイルサイズの 1/10 くらい にまで圧縮できることが多いです。例えば、200 MB あった動画ファイルが、わずか 20 MB 程度にまで小さくなる、といった具合です。数十 MB 程度の数秒程度の動画であれば、KB 単位にまで小さくなります。似たような秒数のアニメーション GIF よりも小さいので、なんだか不思議なくらいです。

また、そこまで品質を落としても、十二分に視聴に耐えます (あくまでも私の感覚では、ですが)。元動画と見比べれば、品質の劣化は一目瞭然なのですが、GitHub の README に貼るような例だと、元動画を知らないと 840 kbps まで品質を落としているとは気づかないかもしれません。

まとめ

Clipchamp などの動画編集ツールで生成した MP4 ファイルが、品質は犠牲にしていいのでもう少し小さくできたら良いのに、という場面に遭遇したことのある方もいらっしゃるのではないでしょうか。そんな時は、ffmpeg を使うことで、動画ファイルを簡単かつ劇的に小さくできます。

特に、h264_qsvh264_nvenc といった GPU のハードウェアエンコーダーを活用することで、高速かつ効率的なトランスコードが可能です。動画のビットレートを思いきって下げてみることで、想像以上にファイルサイズを削減できることがありますので、ぜひお試しください。

Discussion