FFmpegでファイルサイズを小さくするCRF設定のコツ

はい、承知いたしました。FFmpegを用いてファイルサイズを小さくするためのCRF設定に焦点を当てた、約5000語の詳細な解説記事を記述します。


FFmpegでファイルサイズを小さくするCRF設定のコツ

はじめに

デジタルコンテンツが爆発的に増加する現代において、動画はその中でも特に大きなファイルサイズを持つメディアです。高画質化が進むにつれて、1本の動画ファイルが数ギガバイト、あるいはそれ以上の容量になることも珍しくありません。このような大容量の動画ファイルは、ストレージ容量を圧迫するだけでなく、インターネット経由での共有やストリーミングの際の帯域幅を大量に消費し、視聴体験に影響を与えます。

ファイルサイズを小さくすることは、ストレージコストの削減、アップロード/ダウンロード時間の短縮、モバイルデバイスでの再生負荷軽減など、多くのメリットをもたらします。しかし、単にサイズを小さくしようとすると、画質が著しく劣化してしまうことがあります。ファイルサイズを削減しつつ、視覚的な品質をできるだけ維持するためには、適切な動画圧縮の設定が不可欠です。

動画圧縮を行うためのツールは数多く存在しますが、その中でもFFmpegは最も強力で汎用性の高いツールの1つとして広く利用されています。FFmpegは、様々なコーデック(圧縮・展開方式)やフォーマットをサポートし、高度な変換、編集、ストリーミング機能をコマンドラインから実行できます。プロの映像制作者から個人のビデオ愛好家まで、多くのユーザーがFFmpegを活用しています。

FFmpegを使った動画圧縮において、ファイルサイズと画質のバランスをコントロールするための主要な設定の一つにCRF(Constant Rate Factor)があります。CRFは、特にH.264(libx264)やH.265(libx265)、VP9といった現代的な動画コーデックで広く用いられているエンコードモードです。適切にCRFを設定することで、目標とする「知覚品質」を維持しながら、動画の内容に応じて最も効率的なビットレートを割り当て、結果としてファイルサイズを効果的に削減できます。

この記事では、FFmpegを使って動画のファイルサイズを小さくするためのCRF設定に焦点を当て、その仕組み、適切な値の見つけ方、そして他の重要なオプションとの組み合わせ方法について、約5000語にわたって詳細に解説します。これからFFmpegで動画圧縮を始めたい方、あるいは既に使っているがCRFについてもっと深く理解したい方にとって、実践的なガイドとなることを目指します。

動画圧縮の基礎知識

CRFについて理解を深める前に、動画圧縮の基本的な概念について触れておきましょう。なぜ動画は圧縮が必要なのでしょうか?

非圧縮の動画データは膨大です。例えば、フルHD(1920×1080ピクセル)の映像を、1秒間に30フレーム(30fps)、1ピクセルあたり24ビット(約1670万色)で記録する場合、1秒間のデータ量は以下のようになります。

1920 x 1080 (ピクセル) x 24 (ビット/ピクセル) x 30 (フレーム/秒) = 1,492,992,000 ビット/秒

これは約1.5ギガビット/秒です。1時間(3600秒)の映像では、約5.4テラビット(約675ギガバイト)という驚異的なデータ量になります。このようなデータをそのまま扱っていては、現実的にストレージにもネットワークにも大きな負担がかかります。

動画圧縮は、この膨大なデータ量を削減するための技術です。人間の視覚が捉えきれない情報を削減したり、フレーム間やフレーム内の重複する情報を効率的に表現したりすることで、データ量を大幅に削減します。

主な圧縮技術には以下のようなものがあります。

  • フレーム内予測(Intra Prediction): 1つのフレーム内の既にエンコードされた領域から、現在のブロックを予測する技術。フレーム内で空間的な冗長性を排除します。JPEGのような静止画圧縮に近い考え方です。
  • フレーム間予測(Inter Prediction / Motion Estimation & Compensation): 複数のフレーム(通常は前後のフレーム)間の動きを検出・補償し、差分情報のみを記録する技術。動画における時間的な冗長性を排除する最も効果的な手段です。これにより、動きのあるシーンでも効率的に圧縮できます。
  • 変換(Transform): 画像データを周波数領域に変換する技術(例: DCT – 離散コサイン変換)。人間は低周波数成分(全体的な明るさや色の変化)に敏感で、高周波数成分(細かいディテールやノイズ)には比較的鈍感であることを利用します。
  • 量子化(Quantization): 変換によって得られた周波数成分の値を丸める(精度を落とす)処理。これにより、高周波数成分などの重要度の低い情報をより大きく丸めることで、データ量を削減します。量子化の度合いが大きいほどデータ量は減りますが、情報の損失も大きくなり、画質が劣化します。ブロックノイズやモスキートノイズといった圧縮アーティファクトは、主にこの量子化によって発生します。
  • エントロピー符号化(Entropy Coding): 量子化されたデータを、統計的な性質(出現頻度の高いデータは短いコード、低いデータは長いコードで表現するなど)を利用して、さらに効率的に符号化する技術(例: CABAC, CAVLC)。可逆圧縮であり、情報損失なくデータ量を削減します。

これらの技術を組み合わせることで、データ量を1/100以下にすることも可能です。

動画圧縮における重要な概念にビットレート(Bitrate)があります。ビットレートとは、1秒間あたりのデータ量を示す値で、通常はbps(bits per second)またはMbps(Megabits per second)で表されます。ビットレートが高いほど、1秒あたりに多くのデータを使用するため、一般的に画質は高くなりますが、ファイルサイズも大きくなります。逆に、ビットレートが低いほど、画質は低下しますが、ファイルサイズは小さくなります。

動画ファイルの最終的なサイズは、ほぼビットレートに比例します。

ファイルサイズ (ビット) = ビットレート (ビット/秒) × 動画の長さ (秒)

ファイルサイズ (バイト) = ファイルサイズ (ビット) / 8

ビットレートをどのように制御するかによって、主に以下の3つのエンコードモードがあります。

  1. CBR (Constant Bitrate – 固定ビットレート): 動画全体を通して、指定されたビットレートを一定に保とうとするモードです。ストリーミングなど、ネットワーク帯域幅が一定であることを保証したい場合に適していますが、シーンの複雑さに関わらず同じビットレートを割り当てるため、静的なシーンでは unnecessarilyに高品質になったり、動きの激しいシーンではビットレートが不足して画質が劣化したりする傾向があり、圧縮効率はあまり良くありません。
  2. VBR (Variable Bitrate – 可変ビットレート): 動画のシーンの複雑さに応じて、ビットレートを動的に調整するモードです。動きの激しいシーンやディテールが多いシーンには高いビットレートを割り当て、静的でシンプルなシーンには低いビットレートを割り当てます。これにより、全体のファイルサイズを抑えつつ、複雑なシーンでも品質を維持しやすくなります。VBRにはいくつかの種類がありますが、目標とする平均ビットレートを指定するものや、目標とする品質レベルを指定するものがあります。
  3. CRF (Constant Rate Factor – 固定レートファクター): これもVBRの一種ですが、目標とするのはビットレートではなく「知覚的な品質」です。CRF値を指定することで、エンコーダーは動画の各部分に対して、指定されたCRF値が示す品質レベルを維持するために必要なビットレートを動的に割り当てます。結果として、ファイルサイズは動画の内容(複雑さ)に依存して変動しますが、動画全体を通して(指定したCRF値の範囲内で)一貫した品質が得られます。

CRFは、特にファイルサイズの予測が難しくても、一定の品質を維持したい場合に非常に有効なモードです。多くのユーザーにとって、CBRや、平均ビットレートを指定するタイプのVBRよりも、CRFモードでエンコードする方が、画質とファイルサイズのバランスを取りやすいとされています。

CRF(Constant Rate Factor)とは何か

CRF(Constant Rate Factor)は、H.264(libx264)、H.265(libx265)、VP9といった最新の動画コーデックで広く利用されているエンコードモードです。その目的は、「知覚的に一定の品質」を維持しながら、動画の内容に応じて最適なビットレートを割り当てることにあります。

CBRが「時間あたりデータ量」を固定するのに対し、CRFは「品質」を固定しようとします。厳密には、品質そのものを固定するのではなく、量子化の度合いを制御するための「レートファクター」を固定します。量子化は前述の通り、データ量を削減する鍵となるプロセスであり、量子化の度合いが大きいほどデータ量は減りますが、画質は劣化します。CRF値は、この量子化パラメータ(QP: Quantization Parameter)に影響を与えます。

CRF値は通常、整数で指定します。CRF値と品質・ファイルサイズの関係は以下のようになります。

  • CRF値が低いほど: 量子化の度合いが小さくなり、情報の損失が少なくなります。その結果、画質は高くなりますが、必要なデータ量が増えるためファイルサイズは大きくなります。
  • CRF値が高いほど: 量子化の度合いが大きくなり、情報の損失が多くなります。その結果、画質は低くなりますが、データ量が減るためファイルサイズは小さくなります。

重要なのは、CRFモードではエンコーダーが動画のシーンを解析し、複雑さに応じて動的にビットレートを調整する点です。例えば、静止画に近いシンプルなシーンでは低いビットレートで指定された品質を達成できますが、動きが速くディテールに富んだ複雑なシーンでは、同じ品質レベルを達成するためにはより高いビットレートが必要になります。CRFモードは、この必要なビットレートを自動的に計算し、割り当てます。

なぜCRFが推奨されることが多いのでしょうか?

  • 効率性: 動画の内容に応じてビットレートをインテリジェントに配分するため、CBRに比べてファイルサイズを削減しつつ高い品質を維持しやすいです。例えば、CBRでエンコードする場合、全体のビットレートを低めに設定すると、複雑なシーンで画質が著しく劣化する可能性があります。かといって、複雑なシーンに対応できるようにビットレートを高く設定すると、静的なシーンでは unnecessarilyに多くのデータが使われてしまい、全体のファイルサイズが大きくなります。CRFなら、複雑なシーンには十分なビットレートを、シンプルなシーンには必要最低限のビットレートを割り当てることで、全体として効率的な圧縮を実現します。
  • 品質の一貫性: 動画全体を通して、指定したCRF値に基づく品質レベルを(ある程度)一定に保つことができます。ビットレートが固定されているCBRでは、シーンによって品質が大きく変動する可能性があります。
  • 使いやすさ: エンコーダーの専門知識がなくても、CRF値を調整するだけで品質とファイルサイズのバランスを直感的にコントロールできます。目標ビットレートを計算したり、複雑なレートコントロール設定をしたりする必要がありません。

CRFは、動画の内容が事前にわからない場合や、ファイルサイズよりも品質の一貫性を重視したい場合に特に有効です。多くの一般的な用途、例えばパーソナルアーカイブ、ウェブ公開、ローカルでの視聴用などでは、CRFモードが最適な選択肢となるでしょう。

FFmpegでのCRF設定方法

FFmpegでCRFエンコードを行うのは非常に簡単です。基本となるコマンド構造に、ビデオコーデックを指定するオプションと、CRF値を指定するオプションを追加するだけです。

基本的なFFmpegコマンドは以下のようになります。

bash
ffmpeg -i input.mp4 output.mp4

このコマンドでは、入力ファイル input.mp4 を出力ファイル output.mp4 に変換します。特別なオプションを指定しない場合、FFmpegはデフォルトのコーデック(通常は入力ファイルと同じコーデックまたは適切なコーデック)と設定を使用します。多くの場合、デフォルト設定ではファイルサイズが削減されないか、意図しない結果になる可能性があります。

CRFエンコードを指定するには、まずビデオコーデックを指定する必要があります。最も一般的なのはH.264(libx264)とH.265(libx265)です。そして、-crf オプションを使ってCRF値を指定します。

H.264 (libx264) でのCRF設定例:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf <値> output.mp4

ここで、
* -c:v libx264: ビデオコーデックとしてH.264(libx264ライブラリ)を使用することを指定します。
* -crf <値>: CRFモードを有効にし、その値を指定します。<値>の部分に目的の数値を入れます。

H.264におけるCRF値の範囲と目安:

libx264におけるCRF値の範囲は、理論的には0から51までです。
* CRF 0: 可逆圧縮(ロスレス)です。ファイルサイズは非常に大きくなりますが、オリジナルと完全に同じ品質になります。
* CRF 23: libx264のデフォルト値です。一般的に、見た目の劣化がほとんど気にならないレベルで、良好な圧縮率が得られるバランスの取れた値とされています。
* CRF 51: 最も高い値で、非常に低い品質でファイルサイズが最小になります。実用的な品質ではありません。

一般的なエンコードで推奨されるCRF値の範囲は 18から28程度 です。

  • CRF 18程度: 高品質。ほとんどの場合、オリジナルとの違いを見分けられないレベルです。ファイルサイズは大きめになります。
  • CRF 20-24程度: バランス型。デフォルトの23を含むこの範囲は、多くの人にとって画質とファイルサイズの最適なバランスを提供します。ウェブ公開用などによく使われます。
  • CRF 25-28程度: サイズ重視。画質劣化が視覚的に確認できるようになりますが、ファイルサイズはかなり小さくなります。特に動きの少ない映像や、細かいディテールが少ない映像に適しています。
  • CRF 29以上: Aggressive圧縮。品質劣化が顕著になります。非常にサイズを小さくする必要がある場合や、解像度が非常に低い場合などに限られるでしょう。

H.265 (libx265) でのCRF設定例:

H.265(HEVC – High Efficiency Video Coding)は、H.264の後継規格であり、同じ知覚品質であればH.264よりも高い圧縮率を達成できるとされています。FFmpegでH.265を使用する場合も、CRF設定はH.264と同様に行います。

bash
ffmpeg -i input.mp4 -c:v libx265 -crf <値> output.mp4

ここで、
* -c:v libx265: ビデオコーデックとしてH.265(libx265ライブラリ)を使用することを指定します。
* -crf <値>: CRFモードを有効にし、値を指定します。

H.265におけるCRF値の範囲と目安:

libx265におけるCRF値の範囲も0から51までですが、同じCRF値でもH.264より高い圧縮率を目指すため、同じ品質を得るにはH.264よりも少し高いCRF値が必要と言われています。

一般的な推奨範囲は 20から30程度 です。

  • CRF 20-24程度: 高品質。
  • CRF 25-28程度: バランス型。libx265のデフォルト値は28です。H.264のCRF 23と同等かそれ以上の品質/圧縮率が得られるとされています。
  • CRF 29-32程度: サイズ重視。
  • CRF 33以上: Aggressive圧縮。

H.265はH.264よりもエンコード・デコードの処理負荷が高い傾向があります。古いデバイスや性能の低いデバイスでは再生がカクついたり、ハードウェアデコードに対応していなかったりする場合がある点に注意が必要です。

VP9でのCRF設定例:

VP9はGoogleが開発したオープンな動画コーデックで、H.265に匹敵する圧縮効率を持つとされています。FFmpegでVP9を使用する場合もCRF設定が可能です。

bash
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf <値> output.webm

ここで、
* -c:v libvpx-vp9: ビデオコーデックとしてVP9(libvpx-vp9ライブラリ)を使用することを指定します。VP9は通常WebMコンテナと組み合わせて使われます。
* -crf <値>: CRFモードを有効にし、値を指定します。

VP9におけるCRF値の範囲と目安:

libvpx-vp9におけるCRF値の範囲は 0から63まで です。値の傾向は他のコーデックと同様、低いほど高品質・大サイズ、高いほど低品質・小サイズです。

  • CRF 10-20程度: 高品質。
  • CRF 20-35程度: バランス型。YouTubeなどでの推奨値は20-35程度です。
  • CRF 35以上: サイズ重視・Aggressive圧縮。

VP9もH.265と同様に処理負荷が高い傾向があります。

オーディオ設定も同時に行う:

動画ファイルサイズには、ビデオだけでなくオーディオデータも含まれます。ビデオの圧縮率をどんなに高めても、オーディオが無圧縮だったり非常に高音質だったりすると、ファイルサイズ削減の効果が半減することがあります。多くの動画ファイルではビデオデータが大部分を占めますが、オーディオも適切な設定を行うことが望ましいです。

CRF設定と同時にオーディオコーデックとビットレートを指定する例:

bash
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4

  • -c:a aac: オーディオコーデックとしてAACを使用することを指定します。AACはウェブやモバイルデバイスで広くサポートされている効率的なコーデックです。
  • -b:a 128k: オーディオのビットレートを128kbpsに指定します。一般的なステレオ音声であれば、128kbpsまたは192kbpsで十分にクリアな品質が得られます。より低く設定すればサイズは小さくなりますが、音質は劣化します。

オーディオをコピーして再エンコードしない場合は -c:a copy を指定します。ただし、入力ファイルのオーディオコーデックや設定が適切でない場合は、再エンコードを検討すべきです。

その他の基本的なオプション:

  • -y: 確認なしで出力ファイルを上書きします。
  • -n: 出力ファイルが既に存在する場合はエラーで終了します(上書きしません)。
  • -map 0: 入力ファイルの全てのストリーム(ビデオ、オーディオ、字幕など)を出力ファイルに含めます。必要に応じて -map 0:v:0 (最初のビデオストリームのみ), -map 0:a:0 (最初のオーディオストリームのみ) のように特定のストリームを指定することもできます。通常は -map 0 やデフォルトの挙動で問題ありません。

FFmpegコマンドは非常に多くのオプションを持っていますが、CRF設定によるファイルサイズ削減の基本は、上記の -c:v <コーデック>-crf <値> です。

適切なCRF値を見つけるための実践的なアプローチ

CRF設定の最も重要な部分は、「適切なCRF値」を見つけることです。前述の推奨範囲はあくまで一般的な目安であり、最適な値は動画の内容、最終的な用途、そして個人の主観的な品質許容度によって大きく異なります。

動画の内容(動きの激しさ、ディテール、ノイズの量、解像度など)は、同じCRF値でも必要なビットレートや圧縮結果に大きく影響します。

  • 動きが速い、ディテールが多い、ノイズが多い映像: 同じCRF値を指定しても、これらの要素が多い映像ほど、品質を維持するためにより多くのビットレートが必要となり、結果としてファイルサイズが大きくなります。また、圧縮アーティファクト(ブロックノイズなど)が発生しやすくなります。
  • 静的でシンプルな映像: 動きが少なく、ディテールも少ない映像(例: スライドショー、静止画、簡単なアニメーション)は、低いビットレートでも比較的高い品質を維持しやすいため、同じCRF値でもファイルサイズは小さくなります。

目標とするファイルサイズや品質レベルを特定することも重要です。例えば、「ウェブサイトにアップロードする動画で、ファイルサイズを100MB以下に抑えたいが、スマートフォンでの視聴に耐えうる画質は確保したい」といった具体的な目標があると、どのCRF値を目指すべきかの指針になります。

最も効果的な方法は、「テストエンコード」を行うことです。

動画全体を異なるCRF値でエンコードするのは時間がかかります。そこで、動画の短いセグメント(例えば、特に複雑なシーンや動きの激しいシーンを含む10秒〜30秒程度の部分)を切り出して、様々なCRF値でテストエンコードを行うのが効率的です。

テストエンコードの手順例:

  1. 元の動画からテスト用の短いセグメントを切り出す:
    FFmpegを使って、指定した開始時刻から指定した長さだけ動画を切り出すことができます。
    bash
    ffmpeg -i input.mp4 -ss 00:01:00 -t 00:00:30 -c copy output_segment.mp4

    • -ss 00:01:00: 入力動画の1分0秒から開始します。
    • -t 00:00:30: 30秒の長さだけ切り出します。
    • -c copy: ビデオとオーディオを再エンコードせず、そのままコピーします。これにより、高速に正確なセグメントを切り出せます。

    もし、特定の複雑なシーンだけを切り出したい場合は、そのシーンを含む部分を選びます。再エンコードしない -c copy はキーフレームの位置に依存するため、正確な開始・終了時刻で切り出せない場合があります。厳密に指定した時間で切り出したい場合は、入力オプション -ss-i より前に置き、エンコードを行うことで対応できますが、その部分は再エンコードが必要になります。
    bash
    ffmpeg -ss 00:01:00 -i input.mp4 -t 00:00:30 -c:v libx264 -crf 23 -c:a copy output_segment.mp4

  2. 異なるCRF値でテストエンコードを行う:
    切り出した短いセグメントに対して、複数のCRF値を試します。例えば、H.264でエンコードする場合、CRF 20、23、26、29など、数段階のCRF値を試してみます。
    bash
    ffmpeg -i output_segment.mp4 -c:v libx264 -crf 20 -c:a copy output_segment_crf20.mp4
    ffmpeg -i output_segment.mp4 -c:v libx264 -crf 23 -c:a copy output_segment_crf23.mp4
    ffmpeg -i output_segment.mp4 -c:v libx264 -crf 26 -c:a copy output_segment_crf26.mp4
    ffmpeg -i output_segment.mp4 -c:v libx264 -crf 29 -c:a copy output_segment_crf29.mp4

    この際、オーディオは再エンコード時間を短縮するために -c:a copy とすることが多いですが、最終的にオーディオも圧縮する場合は、ここでオーディオ圧縮オプションも含めてテストするとより現実的なファイルサイズが得られます。

  3. 結果を比較評価する:
    エンコードされた各テストファイルを開き、元のセグメントと比較しながら、以下の点を評価します。

    • 主観的な画質: 目で見て、ブロックノイズ、バンディング(滑らかなグラデーション部分の帯状の縞)、ディテールの損失、モスキートノイズ(輪郭周辺のノイズ)などがどの程度発生しているかを確認します。特に動きの激しいシーンや暗いシーン、細かい模様の部分などを注意深く見ます。
    • ファイルサイズ: 各ファイルのサイズを確認します。

この比較評価を通じて、「このCRF値なら許容できる画質で、目標のファイルサイズに近い(あるいは許容範囲内の)サイズになるな」という値を見つけます。

主観的な品質評価の重要性:

動画の品質評価には、PSNR(Peak Signal-to-Noise Ratio)やSSIM(Structural Similarity Index Measure)といった客観的な指標も存在します。これらの指標は、オリジナル画像と圧縮後の画像の数学的な差や構造的な類似度を数値化するもので、FFmpegでも計算できます。

“`bash

H.264 CRF 23でエンコードしつつPSNRとSSIMを計算する例

ffmpeg -i input.mp4 -c:v libx264 -crf 23 -loglevel error -f null – -an -sn -benchmark -nostats -psnr -ssim
``-f null –はエンコード結果をファイルに保存せず破棄するための出力指定です。-an -snはオーディオと字幕を無視、-benchmarkはエンコード時間計測、-nostatsはエンコード中の進捗表示を抑制、-psnr-ssim` でそれぞれの値を計算します。

しかし、これらの客観的な指標は必ずしも人間の視覚が感じる「知覚品質」と一致するわけではありません。例えば、PSNRが高いからといって、人間の目にとって自然で美しい映像であるとは限りません。したがって、最終的には自分の目で見て品質を判断することが最も重要です。

テストエンコードの結果、例えば「CRF 24だと少しノイズが気になるが、CRF 23なら十分許容できる。ファイルサイズもCRF 23なら目標範囲内に収まる。」といった判断ができれば、CRF 23を本番エンコードの値として採用するという流れになります。

CRF以外のファイルサイズ削減に役立つFFmpegオプション

CRFは画質とファイルサイズのバランスを制御するための主要な手段ですが、FFmpegには他にもファイルサイズ削減やエンコード効率向上に役立つ様々なオプションがあります。これらをCRFと組み合わせて使用することで、より良い結果を得られる場合があります。

  1. プリセット (-preset):
    エンコード速度と圧縮効率(=画質対ファイルサイズ比)のトレードオフを制御するオプションです。遅いプリセットほどエンコードに時間はかかりますが、より高度な圧縮技術や最適化処理を行うため、同じ品質であればファイルサイズをより小さくできます(あるいは、同じファイルサイズであればより高品質になります)。

    利用可能なプリセット(libx264/libx265の場合):
    ultrafast, superfast, fast, medium (デフォルト), slow, slower, veryslow, placebo

    CRFエンコードと組み合わせて使用する場合、-preset オプションはエンコーダーがCRF値を達成するためにどのようなアルゴリズムや探索範囲を用いるかに影響します。例えば、veryslow プリセットは、圧縮効率を最大化するために、非常に広範囲な動き予測探索やその他の高度な最適化を行います。

    使用例:
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a copy output.mp4

    この例では、CRF 23の品質レベルを維持しつつ、slow プリセットを使って圧縮効率を高めています。デフォルトの medium よりエンコード時間はかかりますが、最終的なファイルサイズは小さくなるか、同じサイズでも画質が向上することが期待できます。

    ファイルサイズを最大限に小さくしたい場合は、slowslower を試してみる価値があります。ただし、エンコード時間は劇的に増加する可能性があります。時間の制約がない場合に検討しましょう。

  2. 解像度変更 (-vf scale=<幅>:<高さ>):
    動画の解像度を下げることは、ファイルサイズを削減する上で最も強力かつ直接的な方法の一つです。解像度が低くなれば、1フレームあたりのピクセル数が減るため、必要なデータ量が大幅に削減されます。

    使用例:
    フルHD (1920×1080) の動画をHD (1280×720) にリサイズする場合。
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -vf scale=1280:-1 -c:a copy output.mp4

    * -vf scale=1280:-1: ビデオフィルタとして scale を適用します。幅を1280ピクセルに指定し、高さに -1 を指定することで、アスペクト比を維持したまま適切な高さを自動計算させます。
    * 解像度を変更すると、たとえCRF値を同じにしても、ピクセル数が減ることでエンコードが容易になり、結果としてビットレートが下がることが多いです。

    ただし、解像度を下げることは画質劣化に直結します。特に小さな画面での視聴を想定している場合や、元の解像度が高すぎる場合に有効な手段です。

  3. フレームレート変更 (-r <fps>):
    動画のフレームレート(1秒あたりのフレーム数)を下げることも、ファイルサイズ削減に寄与します。フレーム数が減れば、エンコード・保存すべきフレームが減るため、データ量が削減されます。

    使用例:
    30fpsの動画を24fpsに変換する場合。
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -r 24 -c:a copy output.mp4

    * -r 24: フレームレートを24fpsに設定します。

    フレームレートを下げることは、動画の滑らかさに影響を与えます。特に動きの速いシーンでは、カクつきが目立つ可能性があります。一般的に、映画のような24fps、標準的なビデオの29.97fpsや30fps、ゲーム映像のような60fpsなどが使われますが、用途に合わせて検討します。動きの少ないトーク動画などであれば、低めのフレームレートでも許容できる場合があります。

  4. チューン (-tune):
    特定のコンテンツタイプに合わせてエンコーダーのパラメータを最適化するオプションです。適切な -tune オプションを使用すると、そのタイプの映像において圧縮効率や品質を向上させることができます。

    利用可能なチューン(libx264/libx265の場合):
    film (実写映画/ビデオ), animation (アニメ), grain (フィルムグレインを維持), stillimage (静止画に近いコンテンツ), zerolatency (低遅延エンコード), fastdecode (高速デコードを優先) など。

    使用例:
    アニメーションコンテンツの場合。
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -tune animation -c:a copy output.mp4

    * -tune animation: アニメーションコンテンツ向けにエンコーダーを調整します。アニメーションは色が少なく、フラットな領域が多く、動きが規則的な傾向があるため、専用のチューニングが有効な場合があります。

    -tune オプションはCRF値そのものに影響を与えませんが、指定されたCRF値で品質を達成するためのエンコード方法を最適化し、結果としてより効率的な圧縮や、特定の視覚的な問題を軽減する効果が期待できます。

  5. オーディオ設定:
    前述の通り、オーディオもファイルサイズに影響します。特に高品質なロスレスオーディオなどが含まれている場合、オーディオストリームだけでかなりの容量を占めることがあります。

    ファイルサイズ削減のためには、適切なオーディオコーデックとビットレートを選択します。

    • オーディオコーデック (-c:a <コーデック>):
      • AAC: ウェブやモバイルで広く使われる標準的なコーデック。
      • Opus: より高い圧縮効率を持つ比較的新しいコーデック(WebMなどで使用)。
      • MP3: 広く互換性があるが、AACやOpusより圧縮効率は劣る。
    • オーディオビットレート (-b:a <ビットレート>):
      • 一般的なステレオ音声の場合: 128kbps (ウェブ標準), 192kbps (高品質), 256-320kbps (非常に高品質)。
      • モノラル音声の場合: 64kbpsなどで十分なことが多い。

    使用例:
    ビデオはH.264 CRF 23、オーディオはAAC 128kbpsにエンコード。
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac -b:a 128k output.mp4

    もしオーディオ品質がそれほど重要でない場合(例えば、単なるBGMや環境音など)、オーディオビットレートをさらに下げることも検討できます(例: 64kbps)。

  6. メタデータの削除 (-map_metadata -1):
    動画ファイルには、撮影日時、カメラ情報、編集ソフトウェアの情報などのメタデータが含まれていることがあります。これらの情報は通常、ファイルサイズに占める割合は非常に小さいですが、完全に不要であれば削除することでわずかにサイズを削減できます。

    使用例:
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a copy -map_metadata -1 output.mp4

    * -map_metadata -1: 全てのメタデータを削除します。

    これはファイルサイズ削減の主要な手段ではありませんが、プライバシー保護の観点からも有用な場合があります。

CRFとその他のオプションを組み合わせる

ファイルサイズを効率的に小さくするためには、CRF設定を核として、必要に応じて他のオプションを組み合わせることが一般的です。組み合わせるオプションは、元の動画の内容、目標とするファイルサイズ、必要な品質、エンコードにかけられる時間、最終的な再生環境などによって決定します。

組み合わせの戦略例:

  1. 品質を維持しつつファイルサイズを削減したい:

    • 適切なCRF値をテストで見つける(例: H.264でCRF 20-24、H.265でCRF 25-28)。
    • エンコード時間はかかっても良いなら、より遅いプリセットを選択 (-preset slow or slower)。
    • オーディオも適切なビットレートに圧縮 (-c:a aac -b:a 128k)。
    • 必要であれば、コンテンツタイプに合わせて -tune オプションを追加。

    “`bash

    例: H.264 CRF 23, slowプリセット, AAC 128k

    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset slow -c:a aac -b:a 128k output.mp4
    bash

    例: H.265 CRF 28, mediumプリセット, AAC 128k

    ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output.mp4
    “`

  2. とにかくファイルサイズを小さくしたい(多少の画質劣化は許容):

    • CRF値を高めに設定する(例: H.264でCRF 26-29、H.265でCRF 30-33)。
    • 解像度を下げることが可能であれば、大幅な削減が見込める (-vf scale=...)。
    • フレームレートを下げることも検討 (-r ...)。
    • オーディオビットレートも低めに設定 (-b:a 64k など)。
    • エンコード速度を優先する場合は、速めのプリセット (-preset fast or medium)。ファイルサイズ削減効率を優先する場合は、遅めのプリセットも有効。

    “`bash

    例: H.264 CRF 28, HD解像度, mediumプリセット, AAC 96k

    ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset medium -vf scale=1280:-1 -c:a aac -b:a 96k output.mp4
    “`

  3. エンコード速度を優先しつつ、ある程度サイズも小さくしたい:

    • CRF値はバランスの取れた値か、少し高めの値に設定(例: H.264でCRF 23-26)。
    • プリセットは速めのものを選ぶ (-preset fast or medium)。デフォルトの medium は速度と効率のバランスが良いです。
    • オーディオも圧縮。

    “`bash

    例: H.264 CRF 25, fastプリセット, AAC 128k

    ffmpeg -i input.mp4 -c:v libx264 -crf 25 -preset fast -c:a aac -b:a 128k output.mp4
    “`

これらの例はあくまで出発点です。実際のエンコードでは、テストエンコードを通じて、CRF値、プリセット、必要なら解像度やフレームレート、オーディオ設定などを個別に、あるいは組み合わせて調整し、最適なバランス点を見つけることが重要です。

特に、解像度変更はCRF設定以上にファイルサイズに影響を与える可能性がある強力な手段です。元の動画が4Kで、フルHDディスプレイでの視聴が主目的であれば、解像度をフルHDに下げるだけでファイルサイズは劇的に小さくなります。その上で、CRF値を調整して画質を最適化するというアプローチも有効です。

CRFは「品質」を一定に保とうとしますが、低いCRF値(高品質)であっても、解像度やフレームレートが低ければ、最終的な見た目の品質は当然下がります。これらのオプションは互いに影響し合うため、総合的に判断する必要があります。

一般的なユースケースと推奨設定

様々なユースケースにおける、CRF設定を含むFFmpegエンコードの一般的な推奨設定を紹介します。これらはあくまで出発点として参考にし、実際の動画と目標に合わせてテスト調整を行ってください。

1. ウェブ公開用動画 (YouTube, Vimeo, 自サイトなど):

  • 目的: 多くのユーザーが様々なデバイスでスムーズに視聴でき、かつファイルサイズが大きすぎないようにする。プラットフォームの推奨設定も考慮する。
  • コーデック: H.264 (libx264) は最も広く互換性があり、H.265 (libx265) や VP9 (libvpx-vp9) はより高い圧縮効率が得られるが、古いデバイスでの再生に問題が出る可能性がある。ターゲット視聴者層に合わせて選択。
  • CRF: H.264なら20〜24、H.265なら25〜28あたりを基準にテスト。画質とファイルサイズのバランスが重要。
  • プリセット: medium または slow。圧縮効率を高めるために、ある程度エンコード時間をかけるのは一般的。
  • 解像度/フレームレート: 元の動画が高解像度/高フレームレートでも、ターゲットプラットフォームや一般的な視聴環境に合わせて適宜調整(例: 4K→1080p、60fps→30fps)。
  • オーディオ: AAC 128kbps または 192kbps。ステレオで十分な品質が得られる。
  • 例 (H.264):
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output_web.mp4
  • 例 (H.265):
    bash
    ffmpeg -i input.mp4 -c:v libx265 -crf 28 -preset medium -c:a aac -b:a 128k output_web_hevc.mp4
  • 例 (VP9):
    bash
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -preset medium -c:a libopus -b:a 128k output_web_vp9.webm

    VP9のCRFエンコードでは、-b:v 0 を追加することが推奨される場合があります。これは品質ベースのVBRであることを明示するオプションです。オーディオコーデックとしてはOpusがVP9と相性が良いです。

2. ローカルアーカイブ用:

  • 目的: 元の動画の品質を可能な限り維持しつつ、ストレージ容量を節約する。互換性よりも圧縮効率を重視できる場合が多い。
  • コーデック: H.265 (libx265) が最も効率的。H.264でも良い。
  • CRF: H.264なら18〜22、H.265なら20〜25あたり。かなり高品質を目指す。
  • プリセット: slow, slower, あるいは veryslow。エンコードに時間をかけても良いので、最大の圧縮効率を目指す。
  • 解像度/フレームレート: 元のまま(解像度・フレームレート変更なし)。
  • オーディオ: 元のオーディオをコピー (-c:a copy) するか、高品質な圧縮 (-c:a aac -b:a 256k など) を行う。
  • 例 (H.265):
    bash
    ffmpeg -i input.mp4 -c:v libx265 -crf 22 -preset slower -c:a copy output_archive.mp4

    または、高品質AACに変換する場合:
    bash
    ffmpeg -i input.mp4 -c:v libx265 -crf 22 -preset slower -c:a aac -b:a 256k output_archive.mp4

3. モバイルデバイス向け:

  • 目的: モバイルデバイスの再生能力やストレージ容量、データ通信量を考慮し、互換性が高く、ファイルサイズが小さめの動画を作成する。
  • コーデック: H.264 (libx264) が最も安全。H.265も最近のデバイスならサポートされていることが多い。
  • CRF: H.264なら23〜26、H.265なら28〜30あたり。デバイスの画面サイズが小さいので、PCで見るほど高画質でなくても許容できる場合がある。
  • プリセット: medium または fast。エンコード速度もそこそこ重要。
  • 解像度: デバイスの画面サイズに合わせて、1080p、720p、あるいはそれ以下にリサイズ (-vf scale=...) することで、ファイルサイズを大幅に削減できる。
  • フレームレート: 30fpsで十分な場合が多い。
  • オーディオ: AAC 96kbps または 128kbps。
  • 例 (H.264 720p):
    bash
    ffmpeg -i input.mp4 -c:v libx264 -crf 24 -preset medium -vf scale=1280:-1 -c:a aac -b:a 128k output_mobile.mp4

4. 特定用途(スクリーンキャスト、アニメーションなど)へのチューニング:

  • スクリーンキャスト(画面録画): 動きが少なく、テキストやGUIが多い傾向。ディテールの維持とテキストの鮮明さが重要。
    • CRF: 低め(H.264で18〜22)。テキストのエッジがぼやけないようにするため。
    • プリセット: medium or slow
    • チューン: -tune stillimage が効果的な場合がある(画面全体があまり動かない場合)。動きが多い場合は -tune film もしくは指定なし。
    • 例:
      bash
      ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset slow -tune stillimage -c:a aac -b:a 128k output_screencast.mp4
  • アニメーション: 色数が少なく、フラットな領域、直線的な動きが多い傾向。バンディングやブロックノイズを目立たせないことが重要。
    • CRF: 低め〜中程度(H.264で19〜24)。
    • プリセット: medium or slow
    • チューン: -tune animation。これはバンディング軽減に役立つ場合があります。
    • 例:
      bash
      ffmpeg -i input.mp4 -c:v libx264 -crf 22 -preset slow -tune animation -c:a aac -b:a 128k output_animation.mp4

これらの推奨設定は出発点です。必ず自身の動画でテストを行い、最適なCRF値やその他のオプションの組み合わせを見つけてください。特に、CRF値の調整は、ファイルサイズと画質のバランスをコントロールするための主要なノブとして活用しましょう。

トラブルシューティングと注意点

FFmpegでCRFエンコードを行う際に遭遇する可能性のある問題や、注意すべき点について説明します。

1. 圧縮アーティファクト(ブロックノイズ、モスキートノイズ、バンディングなど):

  • 原因: CRF値が高すぎる(=圧縮率が高すぎる)ことによる情報の損失が主な原因です。量子化が粗くなることで発生します。
  • 対策:
    • CRF値を下げる。これが最も直接的な解決策です。
    • より遅いプリセットを使用する。エンコーダーがより高度なアルゴリズムを使って、アーティファクトが目立ちにくいようにビットレートを配分しようとします。
    • 解像度を下げる。低い解像度では、同じCRF値でもアーティファクトが目立ちにくくなる傾向があります。
    • 入力ソースにノイズが多い場合、エンコード前にノイズ除去フィルタ (-vf denoise=...) を適用することも検討できます。ノイズはエンコード効率を低下させ、アーティファクトの原因となり得ます。

2. エンコード時間の増加:

  • 原因: CRF値が低いほど(高品質を目指すほど)、またプリセットを遅くするほど、エンコードにかかる時間は増加します。エンコーダーがより多くの情報を処理し、より複雑な計算を行うためです。
  • 対策:
    • エンコード速度と圧縮効率のバランスを考慮し、許容できるプリセットを選択する。
    • どうしても時間を短縮したい場合は、CRF値を少し上げるか、プリセットを速くする。
    • GPUアクセラレーション対応のエンコーダー(例: NVIDIA NVENC – -c:v h264_nvenc や Intel QuickSync Video – -c:v h264_qsv など)を使用する。ただし、これらは通常、ソフトウェアエンコード(libx264など)ほど圧縮効率は高くない場合があります。

3. 互換性の問題(特にH.265やVP9):

  • 原因: H.265やVP9は比較的新しいコーデックであり、古いデバイスやソフトウェアがハードウェアデコードに対応していない場合があります。その場合、ソフトウェアデコードに頼ることになり、再生がカクついたり、バッテリーを大量に消費したりすることがあります。
  • 対策:
    • ターゲットとする再生環境を考慮し、広く互換性のあるH.264を選択する。
    • H.265やVP9を使用する場合は、エンコード時に特定のプロファイルやレベルを指定して互換性を高める(例: H.265のMain Profile)。
    • 複数のバージョンを用意する(例: H.264版とH.265版)。

4. CRF値が高すぎる場合のリスク:

  • 原因: 過度に高いCRF値を指定すると、ファイルサイズは非常に小さくなりますが、画質劣化が許容範囲を超え、見るに堪えない映像になる可能性があります。特にディテールが多いシーンや動きの激しいシーンで顕著になります。
  • 対策: 必ずテストエンコードを行い、主観的に許容できる品質のCRF値を見つけることが重要です。やみくもに高い値を指定せず、小さなステップで値を増減させてテストしてください。

5. 音ズレなどの問題:

  • 原因: FFmpegのバージョンが古い、入力ファイルに問題がある、複雑なフィルタリングや変換を行っている、オーディオとビデオの処理速度の差など、様々な原因が考えられます。
  • 対策:
    • FFmpegを最新バージョンにアップデートする。
    • 入力ファイルを別のツールで確認し、問題がないか確認する。
    • シンプルなコマンドから始め、一つずつオプションを追加して原因を特定する。
    • -async 1 オプションを試す(オーディオストリームの最初のタイムスタンプを0にする)。
    • 可変フレームレート(VFR)の入力ファイルの場合、固定フレームレート(CFR)に変換することで解決することがあります(-vsync cfr オプションなどを使用)。

CRF設定は非常に強力ですが、万能ではありません。元の動画の品質や内容、そして目標とする出力仕様によって、最適な設定は常に変動します。

まとめ

FFmpegのCRF(Constant Rate Factor)は、動画のファイルサイズを削減しつつ、知覚的な品質を可能な限り維持するための非常に効果的なエンコードモードです。CBRや他のVBRモードとは異なり、CRFは「品質」を基準にビットレートを動的に調整するため、動画の内容に左右されずに一貫した品質を保ちやすく、多くのユースケースにおいて推奨される設定です。

この記事では、CRFの基本的な仕組みから、FFmpegでの具体的な設定方法、H.264、H.265、VP9といった主要コーデックでのCRF値の目安、そして適切なCRF値を見つけるための実践的なテストエンコードのアプローチについて詳しく解説しました。また、CRF設定と組み合わせてファイルサイズ削減やエンコード効率向上に役立つ様々なオプション(プリセット、解像度/フレームレート変更、チューン、オーディオ設定など)や、一般的なユースケースごとの推奨設定、そしてエンコード時のトラブルシューティングについても触れました。

ファイルサイズ削減におけるCRF設定の「コツ」は、以下の点に集約されます。

  • CRFの基本を理解する: CRF値と品質・ファイルサイズの関係(値が低いほど高品質・大サイズ、高いほど低品質・小サイズ)をしっかり把握する。
  • テストエンコードを必ず行う: 短いセグメントを使って、異なるCRF値でエンコードし、画質とファイルサイズを比較評価する。これが最適な値を見つける最も確実な方法です。
  • 主観的な品質評価を重視する: 客観的な指標だけでなく、実際に自分の目で見て、許容できる画質レベルを判断する。
  • 動画の内容を考慮する: 動きの激しさやディテールの多さによって、同じCRF値でも結果は大きく異なります。動画の特性に合わせてCRF値や他のオプション(-tune など)を調整する。
  • 他のオプションと組み合わせる: プリセットは圧縮効率と速度のトレードオフ、解像度やフレームレートの変更はサイズに大きな影響を与えます。オーディオ設定も忘れずに行う。これらをCRFと組み合わせて、総合的な最適化を目指す。
  • 目標を明確にする: 「どれくらいのファイルサイズを目指すか」「どれくらいの品質が最低限必要か」「エンコード時間はどれくらいかけられるか」といった目標を定めることで、設定の方向性が見えやすくなります。

FFmpegは非常に奥深く、多機能なツールです。CRF設定をマスターすることで、動画のファイルサイズを効率的に削減し、ストレージやネットワークの負担を軽減しながら、目的の品質を達成できるようになります。この記事が、FFmpegを使った動画圧縮におけるCRF設定の理解を深め、より効果的なエンコードを実現するための一助となれば幸いです。

さらに詳細な情報や、より高度なオプションについては、FFmpegの公式ドキュメント(https://ffmpeg.org/documentation.html)を参照することをお勧めします。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール