FFmpegプリセット完全ガイド:高速・高品質・軽量化を実現する設定集
はじめに
デジタルコンテンツの制作、編集、配信において、動画ファイルのエンコードは避けて通れないプロセスです。しかし、その複雑さから多くのユーザーが最適な設定を見つけることに苦慮しています。ここで登場するのが、強力なメディアフレームワークであるFFmpegです。FFmpegは、その驚異的な多機能性と柔軟性により、動画や音声の変換、加工、ストリーミングなど、あらゆるメディア処理の根幹をなすツールとして世界中で利用されています。
FFmpegの真の力を引き出すためには、無数のオプションやパラメータを理解し、適切に組み合わせる必要があります。その中でも特に重要なのが、「プリセット」の概念です。プリセットは、エンコード速度、出力品質、ファイルサイズといった相反する要素のバランスを取るための、あらかじめ定義された設定群です。このガイドでは、FFmpegのプリセットを徹底的に掘り下げ、あなたのニーズに合わせた「高速・高品質・軽量化」を実現するための具体的な方法と設定例を、約5000語にわたって詳細に解説します。
初心者の方から、さらに深い最適化を求める上級者まで、すべての方に役立つ情報を提供することを目指します。FFmpegの基本から応用までを網羅し、あなたのメディア処理ワークフローを次のレベルへと引き上げる手助けとなることを願っています。
FFmpegの基本概念
FFmpegは、動画、音声、その他のメディアファイルを変換、ストリーム、記録、再生するためのコマンドラインツールおよびライブラリの集合体です。その中核をなすのは、ffmpegというコマンドラインプログラムです。
コマンドライン構造
FFmpegのコマンドは、基本的に以下の構造で構成されます。
bash
ffmpeg [グローバルオプション] {[入力オプション] -i 入力ファイル} ... {[出力オプション] 出力ファイル} ...
- グローバルオプション: FFmpeg全体に適用される設定(例: ログレベル)。
- 入力オプション: 特定の入力ファイルに適用される設定(例: 入力ファイルのフォーマット、開始時間)。
-i 入力ファイル: 変換元のファイルパス。複数指定可能。- 出力オプション: 特定の出力ファイルに適用される設定(例: コーデック、ビットレート、解像度)。
- 出力ファイル: 変換後のファイルパス。
主要なオプションの紹介
FFmpegには数え切れないほどのオプションがありますが、プリセットを理解する上で特に重要なものをいくつか紹介します。
-c:v <コーデック>: 映像コーデックを指定します。例:-c:v libx264(H.264),-c:v libx265(H.265/HEVC),-c:v libvpx-vp9(VP9)。-c:a <コーデック>: 音声コーデックを指定します。例:-c:a aac,-c:a libmp3lame。-preset <プリセット名>: エンコード速度と品質のトレードオフを決定するプリセットを指定します。後述の詳細を参照。-crf <値>: CRF (Constant Rate Factor) を指定します。品質ベースのエンコードで、値が小さいほど高品質(ファイルサイズ大)、大きいほど低品質(ファイルサイズ小)になります。-b:v <ビットレート>: 映像のビットレートを指定します。例:-b:v 2M(2 Mbps)。-b:a <ビットレート>: 音声のビットレートを指定します。-vf <フィルタグラフ>: 映像フィルターを適用します。例:-vf scale=1280:-1(幅を1280pxにリサイズし、アスペクト比を維持)。-af <フィルタグラフ>: 音声フィルターを適用します。-pix_fmt <ピクセルフォーマット>: ピクセルフォーマット(色空間)を指定します。例:yuv420p。-profile:v <プロファイル>: 映像コーデックのプロファイルを指定します。互換性に影響します。-level <レベル>: 映像コーデックのレベルを指定します。互換性に影響します。
コーデックとコンテナ
- コーデック (Codec): 動画や音声データを圧縮・伸長(エンコード・デコード)するためのアルゴリズムです。H.264 (AVC), H.265 (HEVC), VP9, AV1などが代表的な映像コーデックです。AAC, MP3, Opusなどが代表的な音声コーデックです。
- コンテナ形式 (Container Format): エンコードされた映像ストリーム、音声ストリーム、字幕、メタデータなどを一つのファイルにまとめるための形式です。MP4 (.mp4), MKV (.mkv), MOV (.mov), WebM (.webm) などがあります。コンテナは、その中身(コーデック)を再生可能にするための「箱」のようなものです。
プロファイルとレベル
- プロファイル: 特定のコーデックの機能セットを定義します。例えばH.264では、Baseline(最も基本的な機能)、Main(一般的な利用)、High(高度な機能、高画質)などがあります。古いデバイスや低スペックのデバイスでは、Highプロファイルに対応していない場合があります。
- レベル: 特定のコーデックの制限(最大解像度、フレームレート、ビットレートなど)を定義します。例えばH.264 Level 4.0は、1920×1080@30fpsの映像に対応できます。レベルが高いほど、より高解像度・高フレームレートの映像に対応できますが、古いデバイスとの互換性は低下します。
プリセットの役割と重要性
FFmpegでエンコードを行う際、最適な設定を見つけるのは非常に骨の折れる作業です。エンコード速度、出力品質、ファイルサイズの間には常にトレードオフが存在し、それぞれの目的(例: リアルタイム配信、アーカイブ保存、ウェブ公開)に応じて最適なバランスを見つける必要があります。
ここで「プリセット」が大きな役割を果たします。プリセットは、エンコーダが内部的に使用する多数の複雑なパラメータ群を、あらかじめ定義されたカテゴリ(例: ultrafast, medium, veryslow)にまとめ、ユーザーが簡単に選択できるようにしたものです。
なぜプリセットが必要なのか?
FFmpegの各エンコーダ(特に映像エンコーダのlibx264やlibx265)は、数十から数百に及ぶ詳細なオプションを持っています。これらのオプションは、動き予測の精度、イントラフレーム予測のブロックサイズ、量子化行列の適用方法など、専門的な知識がなければ理解し、適切に設定することは困難です。
プリセットは、これらの複雑なオプション群を、エンコード速度と品質のバランスという直感的な指標に基づいて、最適な組み合わせで設定してくれます。これにより、ユーザーは個々のオプションを深く理解していなくても、目的に合ったエンコード設定を簡単に選択できるようになります。
プリセットが何を設定しているのか?
プリセットは、主に以下の要素に影響を与えます。
- エンコード速度: プリセットが「速い」ほど、計算量が少なく、エンコードにかかる時間が短縮されます。
- 圧縮効率(品質とファイルサイズ): プリセットが「遅い」ほど、より多くの計算資源を使って複雑なアルゴリズムを適用し、同じ品質であればファイルサイズを小さく、同じファイルサイズであれば品質を高くすることができます。
具体的には、動き予測の探索範囲や精度、レート制御アルゴリズムの複雑さ、ツリー最適化の有無、並列処理の度合いなど、エンコーダ内部の様々なアルゴリズムの設定値が変わります。
FFmpegの内部プリセット(H.264/H.265の場合)
多くの映像コーデック、特にH.264 (libx264) やH.265 (libx265) では、共通のプリセット名が使われます。これらのプリセットは、ultrafastからveryslowまで、速度と品質のトレードオフに応じて段階的に用意されています。
ultrafastsuperfastfastmedium(デフォルト)slowslowervery slow
一般的に、mediumが速度と品質のバランスが取れた設定とされており、特別な理由がない限り、ここから調整を始めるのが良いでしょう。より高速なエンコードが必要な場合はfast以上を、より高品質・高圧縮が必要な場合はslow以下を選択します。
H.264 (libx264) プリセットの詳細
H.264は、現在最も広く普及している映像コーデックの一つであり、ウェブ動画、Blu-ray、放送など、様々な用途で利用されています。FFmpegでは、オープンソースのH.264エンコーダであるlibx264が使われます。
エンコード速度と品質のトレードオフ
libx264のプリセットは、エンコード速度と圧縮効率(品質とファイルサイズ)の間で調整を行います。
ultrafast:- 特徴: 最速のエンコード速度を実現します。計算量を極限まで減らすため、高度な圧縮技術はほとんど利用されません。
- 用途: リアルタイムエンコード(ライブ配信、画面録画)、非常に低スペックなデバイスでのエンコード、プレビュー生成など、速度が最優先される場合に適しています。
- 欠点: 圧縮効率は非常に低く、ファイルサイズは大きくなり、同じビットレートでは画質が最も劣化します。
superfast,fast:- 特徴:
ultrafastよりは遅いですが、十分に高速です。ある程度の圧縮効率を保ちつつ、高速エンコードを実現します。 - 用途: ウェブ動画の高速変換、短時間の動画編集における中間ファイル生成など。
- 特徴:
medium(デフォルト):- 特徴: 速度と品質のバランスが最も取れた設定です。多くのユースケースにおいて推奨されるスタート地点です。
- 用途: 一般的な動画変換、ウェブ公開用動画、DVD/Blu-rayオーサリングなど、幅広い用途に適しています。
slow,slower:- 特徴:
mediumよりも多くの計算時間を使い、圧縮効率と画質を向上させます。 - 用途: 高品質なアーカイブ、ストリーミング配信のマスターファイル作成、ファイルサイズを極力抑えたい場合など。
- 特徴:
veryslow:- 特徴: 最もエンコードに時間がかかるプリセットです。可能な限りの最適化を行い、最高品質または最小ファイルサイズ(同じ品質の場合)を実現します。
- 用途: 高品質なアーカイブ、プロフェッショナルな制作物、ファイルサイズを究極まで削減したい場合など、エンコード時間に制約がない場合に適しています。
品質制御オプション (-crf と -b:v)
プリセットはエンコードの「努力の度合い」を決めますが、実際の品質やファイルサイズは、品質制御オプションによってさらに細かく調整します。
-
CRF (Constant Rate Factor) モード (
-crf <値>)- 推奨される品質ベースのエンコード方法です。
- エンコーダは、指定されたCRF値に基づいて、映像の複雑さに応じてビットレートを動的に調整し、目標とする視覚的な品質を維持しようとします。これにより、動きの少ないシーンではビットレートを下げ、動きの激しいシーンではビットレートを上げることで、全体として効率的な圧縮が実現されます。
- 値の意味:
0は可逆圧縮(ファイルサイズは非常に大きい)、51が最低品質です。- H.264の一般的なCRF値:
18-22: 非常に高品質で、ほとんどの場合に十分。23-28: ウェブ動画やモバイル向けにファイルサイズを抑えつつ、許容できる品質。30以上: 品質が目に見えて劣化し始める。
- H.264の一般的なCRF値:
- 利点: 出力ファイルの複雑さによらず、視覚的な品質の一貫性を保ちやすい。ビットレートを指定する必要がないため、手軽に高品質な結果を得られる。
- 例:
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 output.mp4
-
VBR (Variable Bit Rate) / ABR (Average Bit Rate) モード (
-b:v <ビットレート>)- ターゲットとなる平均ビットレートを指定する方法です。
- エンコーダは、その平均ビットレートに近づけるようにビットレートを調整します。シーンによっては指定したビットレートを大きく上回ったり下回ったりします。
- 利点: 出力ファイルのサイズを事前に予測しやすい。ストリーミングサービスなどで帯域幅の制限がある場合に利用されます。
- 欠点: 複雑なシーンでは指定したビットレートでは品質が不十分になる可能性があり、逆に単純なシーンではビットレートが無駄になることがあります。
- 例:
ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 2M output.mp4(平均2 Mbpsのビットレートでエンコード)
-
CBR (Constant Bit Rate) モード (
-b:v <ビットレート> -minrate <ビットレート> -maxrate <ビットレート> -bufsize <バッファサイズ>)- ビットレートをほぼ一定に保つ方法です。ストリーミングプロトコルで厳密な帯域幅管理が必要な場合や、特定のハードウェアでの再生互換性を高めるために使われます。
- 通常はVBRモードの方が効率的です。
主要なオプションとの組み合わせ
-preset <プリセット名>:- エンコードの速度と効率のバランスを設定します。
-crf <値>:- 品質指定(H.264/H.265)。CRFは品質ベースなので、出力ファイルサイズは変動します。
-b:v <ビットレート>:- ビットレート指定。ファイルサイズを固定したい場合に利用します。Two-passエンコードと組み合わせると、この方法でも効率的な圧縮が可能です。
-profile:v <プロファイル>:- 例:
-profile:v high(高機能なH.264プロファイル)。互換性を考慮し、一般的なウェブ動画ではhighで問題ありません。古いデバイス向けにはmainやbaselineも検討されます。
- 例:
-level <レベル>:- 例:
-level 4.0。最大解像度、フレームレート、ビットレートの制限を設定します。ターゲットデバイスの対応レベルを確認することが重要です。
- 例:
-
-tune <チューニングプリセット>:- 特定のコンテンツタイプに合わせてエンコーダを最適化します。これにより、特定のタイプの映像において品質を向上させたり、ファイルサイズを削減したりできます。
film: 実写映画、ドラマなど。animation: アニメーション。色の均一性やエッジの処理を最適化。grain: フィルムグレインが多い映像。ノイズがぼやけないように最適化。stillimage: 静止画が多い映像。psnr,ssim: 特定の品質指標(PSNR, SSIM)を最適化。fastdecode: デコード速度を優先。zerolatency: 遅延を最小化。ライブ配信などで重要。- 例:
ffmpeg -i input.mp4 -c:v libx264 -preset medium -crf 23 -tune film output.mp4
-
-x264opts <オプション>:libx264エンコーダのさらに詳細なオプションを直接指定できます。非常に高度な設定が必要な場合に使用します。例えば、Bフレームの最大数や参照フレーム数などを手動で調整できますが、通常はプリセットや-tuneで十分です。
H.265 (libx265) プリセットの詳細
H.265 (High Efficiency Video Coding, HEVC) は、H.264の後継として開発されたコーデックで、同等の視覚品質をより低いビットレートで実現できる高い圧縮効率が特徴です。特に4Kや8Kのような高解像度映像での利用が推奨されます。FFmpegでは、オープンソースのH.265エンコーダであるlibx265が使われます。
H.264との比較:圧縮効率の向上
H.265は、H.264と比較して約25〜50%のビットレート削減を実現できると言われています。これは、より大きなブロックサイズ(最大64×64ピクセル、H.264は最大16×16)、より多くの予測モード、改善された動き予測、より柔軟なレート制御などの高度なアルゴリズムが導入されたためです。
プリセットの範囲と意味合い
libx265のプリセットは、基本的にlibx264と同じ名称 (ultrafastからveryslow) を持ち、同様に速度と品質のトレードオフを表します。
ultrafast〜veryslow: 概念はH.264と同じですが、H.265はH.264よりも複雑なエンコードプロセスを持つため、同じプリセット名でもH.265の方がH.264よりエンコードに時間がかかる傾向があります。- 品質制御 (
-crf,-b:v): H.265でもCRFモードが推奨されます。- H.265の一般的なCRF値: H.264と同じ品質を求めるなら、H.264よりやや高めのCRF値(例えば、H.264でCRF 23ならH.265でCRF 26-28)を使用しても同等かそれ以上の品質が得られる場合があります。これはあくまで目安であり、コンテンツによって最適な値は異なります。
18-24: 高品質。25-30: 一般的なウェブ・モバイル向け。
高度なオプション (-x265-params)
libx265にも、libx264の-x264optsに相当する-x265-paramsオプションがあります。これにより、TU (Transform Unit) サイズの制御、WPP (Wavefront Parallel Processing) の有効化など、より深いレベルでのカスタマイズが可能です。
H.265エンコードの例:
bash
ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 -c:a aac -b:a 128k output.mp4
この例では、libx265を使用し、mediumプリセットでエンコード、CRF値を28に設定しています。音声はAACコーデックで128kbpsに設定しています。
VP9 (libvpx-vp9) プリセットの詳細
VP9はGoogleが開発したオープンソースの映像コーデックで、WebMコンテナで主に利用されます。H.264と同等以上の圧縮効率を持ち、ライセンス料が不要である点が特徴です。YouTubeやNetflixなどの大規模サービスでも利用されています。FFmpegではlibvpx-vp9エンコーダを使用します。
プリセットと品質モード
VP9エンコーダのプリセットは、H.264/H.265とは異なるアプローチを取ります。
realtime: リアルタイムエンコード向け。速度を最優先し、圧縮効率は劣ります。good(デフォルト): 速度と品質のバランスが取れた設定。一般的な用途向け。best: 最高の品質と圧縮効率を目指しますが、エンコード時間は最も長くなります。
VP9でも、品質制御には-crfまたは-b:vを使用します。
- CRFモード (
-crf <値>):- VP9のCRFは0〜63の範囲で、0が可逆、63が最低品質です。
- 一般的なCRF値:
10-20: 高品質。20-35: 一般的なウェブ動画向け。
- Two-passエンコードの推奨:
- VP9は、Two-passエンコードと非常に相性が良く、高い圧縮効率と品質を実現するために強く推奨されます。特に
bestプリセットと組み合わせることで最大の効果を発揮します。
- VP9は、Two-passエンコードと非常に相性が良く、高い圧縮効率と品質を実現するために強く推奨されます。特に
VP9エンコードの例 (Two-pass)
“`bash
1st pass
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 1 -an -f webm /dev/null
2nd pass
ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 1M -pass 2 -c:a libopus -b:a 128k output.webm
“`
この例では、平均ビットレート1MbpsでVP9をTwo-passエンコードしています。音声はWebMと相性の良いOpusコーデックを使用しています。
AV1 (libaom-av1, SVT-AV1, rav1e) プリセットの詳細
AV1は、AOMedia (Alliance for Open Media) が開発した最新のオープンソース・ロイヤリティフリーな映像コーデックです。H.265やVP9を上回る圧倒的な圧縮効率を持ち、特に4K以上の高解像度コンテンツや、次世代のウェブ動画の標準として期待されています。
エンコーダの種類
FFmpegでAV1をエンコードするには、主に以下の3つのエンコーダが利用できます。
libaom-av1: AOMediaが開発するリファレンスエンコーダ。非常に高い圧縮効率を誇りますが、エンコード速度は非常に遅いです。SVT-AV1: Intelが開発するAV1エンコーダ。libaom-av1に比べて高速で、かつ高品質なエンコードが可能です。速度と品質のバランスが良く、現時点での実用的な選択肢として有力です。rav1e: Rust言語で書かれたAV1エンコーダ。SVT-AV1と同様に、libaom-av1よりも高速で、かつ比較的新しい高速化技術を積極的に取り入れています。
プリセットと品質設定
AV1エンコーダのプリセットは、H.264/H.265とは異なる表記を持つ場合があります。
-
libaom-av1: プリセットではなく、-cpu-usedというオプションで速度と品質のトレードオフを調整します。-cpu-used <値>:0が最も高品質(最も遅い)、8が最も高速(最も低品質)。- Two-passエンコードを強く推奨します。
- CRFモードは
-crfではなく-b:v 0と-row-mt 1 -tile-columns 4 -tile-rows 4(並列処理) を併用することが多いです。
-
SVT-AV1: プリセットとして-preset <値>を使用します。0: 最も遅いが最高品質。12: 最も速いが最低品質。- 一般的には
5〜8あたりが実用的なバランスとされています。 - Two-passエンコードもサポートされています。
- CRFモードは
-crfまたは-qpを使用します(qpは品質優先、crfはファイルサイズも考慮)。
-
rav1e: プリセットとして-speed <値>を使用します。0: 最も遅いが最高品質。10: 最も速いが最低品質。rav1eもTwo-passエンコードをサポートしています。
AV1エンコードの例 (SVT-AV1, Two-pass)
“`bash
1st pass
ffmpeg -i input.mp4 -c:v libsvtav1 -b:v 2M -preset 6 -pass 1 -an -f matroska /dev/null
2nd pass
ffmpeg -i input.mp4 -c:v libsvtav1 -b:v 2M -preset 6 -pass 2 -c:a libopus -b:a 128k output.mkv
``SVT-AV1`を使用し、平均ビットレート2Mbps、プリセット6でTwo-passエンコードしています。AV1はMKVやWebMコンテナで利用されます。
この例では、
AV1は素晴らしい圧縮効率を提供しますが、エンコード時間の長さと、デコードに高い処理能力(またはハードウェア支援)が必要となる点が課題です。
実践的な高速化プリセットと設定例
高速化は、リアルタイム処理、大量の動画変換、プレビュー生成など、時間的制約がある場合に重要になります。
ライブ配信・リアルタイム処理向け (ultrafast/superfast)
ライブ配信やWebカメラからのリアルタイムエンコードでは、遅延(レイテンシ)を最小限に抑えつつ、可能な限り高速なエンコードが求められます。
基本コマンド例:
bash
ffmpeg -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -pix_fmt yuv420p -c:a aac -b:a 128k output.mp4
* -preset ultrafast: 最速のエンコードを強制します。これにより、動き予測などの複雑な計算が大幅に省略されます。
* -tune zerolatency: 遅延を最小限に抑えるようにエンコーダを最適化します。Bフレーム(双方向予測フレーム)の使用を抑えたり、GOP (Group of Pictures) 構造を単純化したりします。
* -pix_fmt yuv420p: 多くのデバイスで広くサポートされているピクセルフォーマットです。互換性を高めます。
* -c:a aac -b:a 128k: 音声コーデックをAACに指定し、ビットレートを128kbpsに設定。音声処理もシンプルにします。
さらに高速化するための考慮事項:
- GOP構造の調整:
-g <フレーム数>: GOP(Keyframe間のフレーム数)を短くすると、デコード開始が速くなり、遅延も減りますが、圧縮効率は低下します。-keyint_min <フレーム数>: 最小キーフレーム間隔。- 例:
-g 30 -keyint_min 30(30フレームごとにキーフレームを強制し、GOPを固定)。
- 解像度とフレームレートの削減:
-vf scale=960:-1: 解像度を下げることで、処理するピクセル数を減らし、エンコード時間を短縮します。-r 24: フレームレートを下げることも効果的です。
- CPUスレッドの利用:
-threads <数>: FFmpegが利用するCPUスレッド数を指定します。通常は自動検出されますが、明示的に指定することで最適化できる場合があります。ただし、多すぎるとオーバーヘッドが増える可能性もあります。
GPUエンコードの活用 (NVENC, VAAPI, QSV)
CPUエンコードの限界を超える高速化を実現するために、グラフィックカードに搭載された専用のハードウェアエンコーダを利用することが非常に有効です。これらのハードウェアエンコーダは、多くの場合、CPUエンコードよりもはるかに高速であり、リアルタイムエンコードや複数ストリームの同時処理に最適です。ただし、一般的にソフトウェアエンコード(例: libx264のveryslowプリセット)に比べて画質や圧縮効率はやや劣る傾向があります。
- NVIDIA NVENC (NVIDIA Video Encoder): NVIDIA GeForce/Quadro/Tesla GPUに搭載。H.264 (NVENC) とH.265 (HEVC_NVENC) に対応。
- コマンド例:
bash
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p5 -tune ll -c:a aac -b:a 128k output.mp4-c:v h264_nvenc: NVENC H.264エンコーダを使用。-preset p5: NVENC独自のプリセット。p1(最高品質/最低速) からp7(最低品質/最速) までの範囲。p5はバランスが良い。-tune ll:lowlatency(低遅延)チューニング。ライブ配信向け。
- コマンド例:
- Intel QSV (Quick Sync Video): Intel Coreプロセッサの内蔵GPUに搭載。H.264 (h264_qsv) とH.265 (hevc_qsv) に対応。
- コマンド例:
bash
ffmpeg -i input.mp4 -c:v h264_qsv -preset veryfast -look_ahead 0 -c:a aac -b:a 128k output.mp4-c:v h264_qsv: QSV H.264エンコーダを使用。-preset veryfast: QSV独自のプリセット。veryfastからmediumまで。-look_ahead 0: 低遅延設定。
- コマンド例:
- AMD VCE/AMF (Video Coding Engine / Advanced Media Framework): AMD Radeon GPUに搭載。H.264 (h264_amf) とH.265 (hevc_amf) に対応。
- コマンド例:
bash
ffmpeg -i input.mp4 -c:v h264_amf -qualitylevel speed -c:a aac -b:a 128k output.mp4-c:v h264_amf: AMF H.264エンコーダを使用。-qualitylevel speed: 品質レベルを速度優先に。
- コマンド例:
- VAAPI (Video Acceleration API): Linux環境でGPUを利用するためのAPI。Intel、AMD、NVIDIA (プロプライエタリドライバー使用時) など幅広いハードウェアで利用可能。
- コマンド例:
bash
ffmpeg -i input.mp4 -vf 'format=nv12,hwupload' -c:v h264_vaapi -qp 20 -c:a aac -b:a 128k output.mp4format=nv12,hwupload: 映像データをGPUメモリにアップロードするための前処理。-c:v h264_vaapi: VAAPI H.264エンコーダを使用。-qp 20: 品質設定(VAAPIではQP値を直接指定することが多い)。
- コマンド例:
注意点:
* FFmpegのビルド: これらのハードウェアエンコーダを利用するには、FFmpegがそれぞれのエンコーダライブラリをサポートするようにビルドされている必要があります。公式の静的ビルドやディストリビューションのパッケージでは、必要なライブラリが有効化されているか確認が必要です。
* ドライバ: 最新のGPUドライバがインストールされていることを確認してください。
* 互換性: 特定のGPUモデルやドライババージョンによって、利用できるコーデックやオプションに制限がある場合があります。
実践的な高品質化プリセットと設定例
高品質化は、最終的なアーカイブ、Blu-ray制作、プロフェッショナルな映像作品など、画質が最優先される場合に重要になります。
アーカイブ・マスター品質向け (slower/veryslow)
最高の画質と圧縮効率を両立させるためには、エンコード時間を犠牲にして、エンコーダが最大限の計算を行うように設定します。
基本コマンド例 (H.264):
bash
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -crf 18 -tune film -c:a aac -b:a 320k output_high_quality.mp4
* -preset veryslow: libx264エンコーダに、可能な限り多くの最適化アルゴリズムを適用させます。これにより、複雑な動き予測、詳細なレート制御、より効率的なブロック分割などが実行され、視覚的な品質を向上させつつ、ビットレートを効率的に利用します。
* -crf 18: 非常に高い品質を維持するためのCRF値です。コンテンツや個人の感覚にもよりますが、CRF 18は「元の映像とほとんど区別がつかない」レベルの品質を提供することが多いです。
* -tune film: 実写映像に最適化します。グレインの保持やバンディングの抑制などに効果があります。
* -c:a aac -b:a 320k: 音声も高音質を保つために、320kbpsなどの高ビットレートを選択します。
H.265での高品質化例:
bash
ffmpeg -i input.mp4 -c:v libx265 -preset veryslow -crf 20 -c:a aac -b:a 320k output_high_quality_hevc.mp4
* H.265の場合、H.264よりさらに高効率なため、CRF値はH.264より高めに設定しても同等以上の品質が得られることがあります。20〜24程度が目安です。
Two-passエンコードの詳細と推奨
CRFモードは品質ベースで非常に優れていますが、ファイルサイズを厳密にコントロールしたい(例: 特定の容量に収めたい、特定のビットレートにしたい)場合に、Two-passエンコードが最高の品質と効率を提供します。
Two-passエンコードでは、エンコードを2回行います。
1. 1st Pass (分析パス):
* 映像ストリームの内容を詳細に分析し、各シーンの複雑度や必要なビットレートなどの情報をログファイルに書き出します。このパスでは実際のエンコードは行われず、音声も通常は無視されます。
* -pass 1: 1st passであることを指定。
* -an: 音声を無効化。
* -f null /dev/null (Linux/macOS) または NUL (Windows): 出力ファイルを生成せず、ログファイルだけ書き込む。
2. 2nd Pass (エンコードパス):
* 1st Passで生成されたログファイルを読み込み、その情報に基づいて各シーンに最適なビットレートを割り当てながら、実際のエンコードを行います。これにより、複雑なシーンには多くのビットレートを割り当て、単純なシーンではビットレートを節約することで、指定した平均ビットレート内で最高の品質を実現します。
* -pass 2: 2nd passであることを指定。
* -b:v <ビットレート>: 目標とする平均ビットレートを指定。
Two-passエンコードの例 (H.264):
“`bash
1st Pass
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -b:v 5M -pass 1 -an -f mp4 /dev/null
2nd Pass
ffmpeg -i input.mp4 -c:v libx264 -preset veryslow -b:v 5M -pass 2 -c:a aac -b:a 320k output_twopass.mp4
``veryslow`プリセットで最高品質を追求しています。
この例では、映像ビットレートを平均5Mbpsに設定し、
その他の高品質化オプション
- ビット深度 (
-pix_fmt):yuv420p10le: 10ビット深度(HDRコンテンツなどに利用)。より豊かな色表現とバンディング(グラデーションの縞模様)の軽減に寄与します。ただし、ファイルサイズは増大し、対応デバイスも限られます。
- カラーレンジとカラースペース:
-color_range tv(Limited Range) または-color_range pc(Full Range): 映像のカラーレンジを指定。通常はtv(16-235) ですが、PCで制作された映像はpc(0-255) の場合があります。-colorspace <スペース>: 色空間を指定 (e.g.,bt709,bt2020)。HDRコンテンツではbt2020が使われます。- これらの設定は、カラーシフトを防ぎ、意図した通りの色で再生されるために重要です。
- ノイズフィルタリング:
-vf denoise=...: 元の映像にノイズが多い場合、エンコード前にノイズ除去フィルターを適用することで、エンコーダがノイズを「情報」として圧縮しようとするのを防ぎ、結果としてファイルサイズを減らしつつ、クリーンな画質を得られることがあります。ただし、過度なノイズ除去はディテールを失わせる可能性があります。
実践的な軽量化プリセットと設定例
軽量化は、ウェブ公開、モバイルデバイスでの再生、ストレージ容量の節約など、ファイルサイズが重要な場合に役立ちます。品質を犠牲にすることなく、可能な限りファイルサイズを削減することが目標です。
ウェブ公開・モバイル向け (medium/fast)
ウェブやモバイル向けでは、再生互換性とファイルサイズのバランスが重要です。ある程度の画質を保ちつつ、ダウンロード時間を短縮したり、モバイルデータ通信量を節約したりすることを目的とします。
基本コマンド例 (H.264):
bash
ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 26 -profile:v high -level 4.0 -c:a aac -b:a 96k -movflags +faststart output_light.mp4
* -preset fast: ある程度の速度を確保しつつ、mediumより少しだけ圧縮効率を上げます。ウェブ動画では、エンコード時間も考慮に入れる必要があるため、fastやmediumが適しています。
* -crf 26: H.264でウェブやモバイル向けに推奨されるCRF値は24〜28あたりです。コンテンツの複雑さによりますが、26は視覚的に許容できる品質を保ちつつ、ファイルサイズを大幅に削減できます。
* -profile:v high -level 4.0: ほとんどの現代のデバイスやウェブブラウザでサポートされているプロファイルとレベルです。互換性と機能を両立させます。
* -c:a aac -b:a 96k: 音声ビットレートを96kbpsに下げることで、ファイルサイズをさらに削減します。ウェブ動画では、128kbpsや96kbpsでも十分な品質が得られることが多いです。
* -movflags +faststart: MP4ファイルをストリーミングに最適化します。ファイルのヘッダー情報(moovアトム)をファイルの先頭に配置することで、ダウンロードが完了する前に再生を開始できるようになります。
H.265での軽量化例:
bash
ffmpeg -i input.mp4 -c:v libx265 -preset fast -crf 30 -profile:v main -level 4 -c:a aac -b:a 64k -movflags +faststart output_light_hevc.mp4
H.265はH.264より高圧縮なので、さらに高いCRF値(例: 30)や低い音声ビットレート(例: 64k)でも同等かそれ以上の品質を実現できる場合があります。
その他の軽量化テクニック
- 解像度の調整 (
-vf scale=...):ffmpeg -i input.mp4 -vf scale=1280:-1 output_720p.mp4- 元の映像が4KやフルHDの場合でも、ターゲットがモバイルであれば720p(1280×720)や480p(854×480)に解像度を下げることが、ファイルサイズ削減に最も効果的です。解像度を下げると、処理するピクセル数が減るため、必要なビットレートが大幅に減少します。
- フレームレートの削減 (
-r <fps>):ffmpeg -i input.mp4 -r 24 output_24fps.mp4- 元の映像が60fpsであっても、ウェブ公開用であれば24fpsや30fpsに削減することで、フレームあたりのデータ量を減らせます。
- メタデータの削除 (
-map_metadata -1):ffmpeg -i input.mp4 -map_metadata -1 output_no_metadata.mp4- 動画ファイルに付随する作成日時、カメラ情報、著作権情報などのメタデータを削除することで、ごくわずかですがファイルサイズを削減できます。プライバシー保護にも役立ちます。
- オーディオの軽量化:
- コーデックの選択: AACが広くサポートされており、効率も良いです。より新しいOpusコーデックは、AACよりも低ビットレートで高品質を実現できますが、対応デバイスはAACほど多くありません。
- チャンネル数の削減: ステレオをモノラルにする (
-ac 1) ことも、ファイルサイズ削減に寄与します。 - サンプリングレートの削減:
48000Hzを44100Hzにすることも検討できますが、音質への影響は比較的小さいです。
その他の重要なオプションとテクニック
Two-passエンコード
前述の通り、Two-passエンコードはファイルサイズを目標ビットレートに正確に合わせつつ、最高の品質を引き出すための強力な方法です。特に、VBRモードで特定のファイルサイズを達成したい場合に必須となります。
基本的なコマンド構造:
“`bash
1st Pass: ログファイル生成 (映像のみ、音声なし)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 1 -an -f mp4 /dev/null
2nd Pass: 実際のエンコード (ログファイル参照)
ffmpeg -i input.mp4 -c:v libx264 -b:v 2M -pass 2 -c:a aac -b:a 128k output.mp4
``/dev/null
*(Unix/Linux/macOS) またはNUL(Windows) は、出力ファイルをディスクに書き込まずに捨てるための特別なデバイスファイルです。これにより、1st passで余計なファイルが生成されるのを防ぎます。-passlogfile <パス>`: ログファイルのパスを明示的に指定することもできます。指定しない場合、一時ディレクトリに自動生成されます。
*
フィルターオプション (-vf, -af)
FFmpegの強力な機能の一つが、豊富なフィルターです。これらは-vf (video filter) や-af (audio filter) オプションを使って適用します。
- 映像フィルター (
-vf):- リサイズ (
scale):-vf scale=1280:-1(幅を1280pxに、高さはアスペクト比維持)。 - クロップ (
crop):-vf crop=w:h:x:y(例:-vf crop=1920:800:0:140で上下をクロップ)。 - デノイズ (
denoise_vaapi,hqdn3dなど):-vf hqdn3d(高品質3Dデノイズ)。映像のノイズを低減し、エンコーダがノイズを圧縮する労力を減らすことで、圧縮効率を上げたり、クリーンな画質を得たりできます。 - フレームレート変更 (
fps):-vf fps=fps=30。 - 字幕の焼き付け (
subtitles):-vf subtitles=subtitle.srt(SRTファイルを映像に焼き付け)。 - 回転/反転 (
transpose,hflip,vflip):-vf transpose=1(時計回りに90度回転)。 - 色調補正 (
colorlevels,colorspaceなど):-vf colorlevels=rimd=1:rild=1(RGBレベル調整)。
- リサイズ (
- 音声フィルター (
-af):- ボリューム調整 (
volume):-af volume=2.0(音量を2倍に)。 - ノーマライズ (
loudnorm):-af loudnorm(音量を均一化し、ラウドネス基準に合わせる)。 - イコライザー (
equalizer):-af equalizer=f=1000:width_type=h:w=500:g=10(特定の周波数帯を調整)。 - チャンネルマッピング (
channelmap):-af channelmap=channel_layout=stereo(チャンネル構成を変更)。
- ボリューム調整 (
複数のフィルターを適用する場合は、カンマで区切って記述します。
例: ffmpeg -i input.mp4 -vf "scale=1280:-1,fps=30" -c:v libx264 output.mp4
オーディオ設定 (-c:a, -b:a, -ar, -ac)
映像だけでなく、音声の設定もファイルサイズや互換性に大きく影響します。
-c:a <コーデック>: 音声コーデックを指定。aac(MPEG-4 AAC): MP4コンテナで最も広く使われ、効率も良い。FFmpegにはネイティブのAACエンコーダと外部ライブラリのlibfdk_aacがあります。libfdk_aacの方が高品質ですが、FFmpegのビルド時に有効化されている必要があります。- 例:
-c:a aac -b:a 128k - 例 (高品質):
-c:a libfdk_aac -b:a 192k
- 例:
libopus(Opus): WebMコンテナで推奨される、非常に高効率なコーデック。低ビットレートでも高品質。- 例:
-c:a libopus -b:a 64k
- 例:
libmp3lame(MP3): 非常に広く互換性があるが、AACやOpusに比べて効率は劣る。- 例:
-c:a libmp3lame -b:a 128k
- 例:
-b:a <ビットレート>: 音声のビットレートを指定。ウェブ動画では64k〜128kが一般的。高音質を目指すなら192k〜320k。-ar <サンプリングレート>: サンプリングレートを指定 (例:-ar 48000for 48kHz)。-ac <チャンネル数>: チャンネル数を指定 (例:-ac 2for stereo,-ac 1for mono)。
コンテナ形式の選択
出力ファイルの拡張子によって、FFmpegは自動的にコンテナ形式を決定しますが、明示的に-f <フォーマット>で指定することも可能です。
- MP4 (
.mp4): 最も汎用的なコンテナ形式。H.264, H.265, AACコーデックと相性が良い。ウェブブラウザやモバイルデバイス、スマートTVなど幅広いデバイスで再生可能。- ストリーミングに最適化 (
-movflags +faststart): MP4ファイルのメタデータ(moovアトム)をファイルの先頭に移動させることで、ファイル全体がダウンロードされる前に再生を開始できるようになります。ウェブでの埋め込み動画やストリーミングでは必須のオプションです。
- ストリーミングに最適化 (
- MKV (
.mkv): Matroska Multimedia Container。非常に柔軟性が高く、多様なコーデックやトラック(多言語音声、多言語字幕)を格納できる。オープンソース。- 高品質なアーカイブや、複雑なマルチトラックコンテンツの保存に適しています。
- WebM (
.webm): Googleが主導するオープンなWeb向けコンテナ形式。VP8, VP9, AV1映像コーデックとVorbis, Opus音声コーデックが使われる。HTML5ビデオでサポート。
エラー処理とデバッグ
FFmpegのエンコードがうまくいかない場合、ログレベルを上げて詳細な情報を確認することが重要です。
-v <ログレベル>:quiet: 最低限の出力。info(デフォルト): 標準情報。warning: 警告のみ。error: エラーのみ。debug: 詳細なデバッグ情報(問題特定に役立つことが多い)。verbose: より詳細な情報。
- ログファイルの保存:
ffmpeg -i input.mp4 ... output.mp4 > log.txt 2>&1- これにより、FFmpegの標準出力と標準エラー出力が
log.txtファイルにリダイレクトされ、後で内容を確認できるようになります。
高度なカスタマイズとパフォーマンス最適化
FFmpegのプリセットは非常に便利ですが、さらに深いレベルでパフォーマンスを最適化したり、特定の要件を満たしたりするために、より詳細な知識が必要になることがあります。
-presetの内部設定の理解
FFmpegのプリセットが具体的にどのようなエンコーダオプションを設定しているのかを知ることは、高度なカスタマイズの第一歩です。
例えば、libx264のプリセットがどのような設定であるかを確認するには、以下のコマンドを使用します。
bash
ffmpeg -h encoder=libx264
このコマンドは、libx264エンコーダのすべてのオプションとそのデフォルト値、そして各プリセット(ultrafastからveryslow)がどのようにこれらのオプションを変更しているかを表示します。これにより、「veryslowプリセットはme_rangeを大きくし、subqを高く設定しているな」といった具体的な情報が得られ、そこから自分のニーズに合わせて特定のオプションをオーバーライドできるようになります。
CPUコアの利用 (-threads)
FFmpegは通常、CPUの利用可能なコア数に基づいて最適なスレッド数を自動的に決定します。しかし、場合によっては手動で調整することでパフォーマンスが向上することもあります。
-threads 0: (デフォルト) FFmpegが自動で最適なスレッド数を決定します。通常はこの設定で問題ありません。-threads <N>: 明示的にスレッド数を指定します。例えば、物理コア数の2倍(論理プロセッサ数)を指定すると良い結果が得られることがあります。ただし、あまりにも多くのスレッドを指定すると、スレッド管理のオーバーヘッドが増えてかえってパフォーマンスが低下することもあります。
FFmpegのビルドオプション
特定のコーデックやハードウェアエンコーダを利用するためには、FFmpegがそれらのライブラリをサポートするようにビルドされている必要があります。
- 公式のバイナリビルドでは、主要なコーデックやハードウェアエンコーダがサポートされていることが多いですが、一部のライセンスが制限されるもの(例:
libfdk_aac,libx264の一部機能)は含まれていない場合があります。 - 自分でFFmpegをソースコードからビルドする場合、
./configureコマンドで必要なライブラリや機能を有効化します(例:--enable-libx264,--enable-libx265,--enable-cuda,--enable-libfdk-aacなど)。
ハードウェアアクセラレーションの深掘り
GPUエンコードは高速化に非常に有効ですが、さらにパフォーマンスを引き出すための考慮事項があります。
- エンコーダプリセットとチューニング: 各GPUエンコーダ(NVENC, QSV, AMF)にも独自のプリセットやチューニングオプションがあります。これらを適切に選択することで、速度と品質のバランスを調整できます。
- NVENC:
-preset(p1-p7),-tune(ll, hq, ul) - QSV:
-preset(veryfast, faster, fast, medium, slow, slower, veryslow) - AMF:
-qualitylevel(speed, balanced, quality)
- NVENC:
- GPUメモリとVRAM: 高解像度(4K以上)や高フレームレートの映像を処理する場合、十分なGPUメモリ(VRAM)が搭載されていることが重要です。VRAMが不足すると、パフォーマンスが低下したり、エンコードが失敗したりする可能性があります。
- ドライバの更新: GPUドライバは常に最新の安定版に更新しておくことを強く推奨します。新しいドライバには、エンコーダの性能向上やバグ修正が含まれていることが多いです。
- ハードウェアデコードとエンコードの組み合わせ:
- FFmpegでは、入力ファイルのデコードもGPUで行い、そのデコードされたフレームを直接GPUエンコーダに渡すことで、CPUとGPU間のデータ転送オーバーヘッドを最小限に抑え、エンドツーエンドのパフォーマンスを向上させることができます。
- 例 (NVIDIA):
bash
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -preset p5 -tune ll output.mp4-hwaccel cuda: CUDAを使ってデコードを高速化。-hwaccel_output_format cuda: デコードされたフレームをCUDAフォーマットで出力し、GPUメモリ上に保持。
- この設定は、特に4Kなどの重いソースファイルを扱う場合に非常に効果的です。
まとめ
FFmpegのプリセットは、動画エンコードにおける速度、品質、ファイルサイズの複雑なトレードオフを効率的に管理するための強力なツールです。ultrafastからveryslowまでの各プリセットは、エンコーダがどれだけ「努力」して圧縮を行うかを定義し、あなたの目的(リアルタイム配信、アーカイブ、ウェブ公開など)に応じて最適なバランスを提供します。
本ガイドでは、H.264、H.265、VP9、AV1といった主要な映像コーデックにおけるプリセットの特性と、-crfや-b:vといった品質制御オプションとの組み合わせについて詳しく解説しました。また、高速化のためのGPUエンコード、高品質化のためのTwo-passエンコード、軽量化のための解像度・音声調整といった実践的なテクニックと具体的なコマンド例も多数紹介しました。
FFmpegの真の力は、これらのオプションとプリセットを組み合わせ、あなたの特定のニーズに合わせてカスタマイズする能力にあります。最適な設定は、元の素材、目的の品質、許容できるファイルサイズ、利用可能なハードウェアリソースによって常に異なります。このため、ここで紹介した設定例を参考にしつつ、ご自身の環境で実際に試行錯誤を重ねることが最も重要です。
デジタルメディアの世界は常に進化しており、AV1のような新しいコーデックや、さらなるハードウェアアクセラレーションの進歩が期待されます。FFmpegは、これらの変化にも迅速に対応し続けるでしょう。この完全ガイドが、FFmpegを使いこなし、あなたのメディア処理ワークフローをより効率的で高品質なものにするための一助となれば幸いです。