ffmpeg vcodec の選び方と設定例


FFmpeg ビデオコーデックの選び方と設定例:詳細解説

はじめに

FFmpeg は、音声や動画のフォーマット変換、ストリーミング、編集、録画など、多岐にわたるメディア処理を可能にする強力なコマンドラインツールです。FFmpeg の機能の中核をなすのが、様々なコーデック(Codec: Encoder/Decoder)のサポートです。特にビデオコーデックは、動画の品質、ファイルサイズ、互換性、エンコード/デコード速度に直接影響するため、その選択と設定は非常に重要です。

しかし、FFmpeg がサポートするビデオコーデックは非常に多岐にわたり、それぞれの特性、適切な使用シーン、そして詳細な設定オプションを理解するのは容易ではありません。本記事では、FFmpeg で利用可能な主要なビデオコーデックに焦点を当て、それぞれの特徴、メリット・デメリット、そして具体的なFFmpegコマンド例を交えながら、どのように最適なコーデックを選び、設定するかを詳細に解説します。

記事の構成は以下の通りです。

  1. ビデオコーデックの基礎知識: コーデックとコンテナの違い、主要な動画パラメータ(ビットレート、解像度、フレームレート、GOPなど)の解説。
  2. 主要ビデオコーデック詳解:
    • H.264 (AVC) / libx264
    • H.265 (HEVC) / libx265
    • VP9 / libvpx-vp9
    • AV1 / libaom-av1, rav1e, svt-av1
    • プロフェッショナル向けコーデック (ProRes, DNxHD/HR)
    • ロスレス/可逆圧縮コーデック (FFV1, Ut Video)
    • その他(MPEG-2, MJPEGなど)
  3. 適切なビデオコーデックの選び方: 利用目的、互換性、品質、速度、ライセンスなどを考慮した選択基準。
  4. FFmpegにおける一般的なビデオエンコード設定: ビットレート制御 (CRF, ABR, VBR)、プリセット、プロファイル、レベル、キーフレーム、スレッド設定など。
  5. ハードウェアアクセラレーション: GPUを利用した高速エンコード(NVENC, VAAPI, QuickSync, VideoToolboxなど)について。
  6. 実践!FFmpeg コマンド例: 様々なシナリオ(Web配信用、アーカイブ用、編集用、高画質変換など)に応じた具体的なコマンドライン例と解説。
  7. トラブルシューティングとヒント: よくある問題と解決策。
  8. まとめと将来展望:

このガイドを通じて、FFmpeg を使った動画エンコードにおいて、より効果的にビデオコーデックを選択・設定できるようになることを目指します。

1. ビデオコーデックの基礎知識

まず、ビデオコーデックについて理解するために必要な基本的な用語と概念を整理します。

コーデックとコンテナ

  • コーデック (Codec): 映像データをエンコード(符号化・圧縮)およびデコード(復号・展開)するためのアルゴリズムまたはプログラムです。コーデックは、生の動画データを効率的に保存または伝送可能な形式に変換し、再生時に元のデータに戻します。H.264, H.265, VP9, AV1などがこれに該当します。
  • コンテナ (Container Format): 複数のデータストリーム(映像ストリーム、音声ストリーム、字幕ストリーム、メタデータなど)を一つのファイルにまとめるためのファイル形式です。コンテナ形式は、これらのストリームをどのように配置し、同期させるかを定義しますが、実際の映像や音声の圧縮方法を定義するわけではありません。MP4, MKV, MOV, AVIなどがこれに該当します。

FFmpeg コマンドでは、-c:v オプションでビデオコーデックを、-c:a オプションでオーディオコーデックを、そして出力ファイルの拡張子や -f オプションでコンテナ形式を指定することが一般的です。例えば、output.mp4 というファイルは MP4 コンテナであり、その中に H.264 映像ストリームと AAC 音声ストリームが含まれている、といった形になります。

主要な動画パラメータ

ビデオコーデックの設定を理解するには、以下のパラメータが重要です。

  • 解像度 (Resolution): 画面のピクセル数。例:1920×1080 (Full HD), 3840×2160 (4K UHD)。高い解像度ほど詳細な映像になりますが、データ量も増加します。
  • フレームレート (Frame Rate, FPS: Frames Per Second): 1秒間に表示されるフレーム(静止画)の数。例:24fps (映画), 30fps (テレビ), 60fps (ゲーム、スポーツ)。フレームレートが高いほど滑らかな動きになりますが、データ量も増加します。
  • ビットレート (Bitrate): 1秒あたりのデータ量(ビット数)。bps (bits per second) または kbps (kilobits per second), Mbps (megabits per second) で表されます。ビットレートは、ファイルサイズと映像品質に大きく影響します。同じコーデック、解像度、フレームレートであれば、ビットレートが高いほど高画質になり、ファイルサイズも大きくなります。
  • GOP (Group of Pictures): 映像圧縮において、関連するフレームのグループを指します。GOPは通常、Iフレーム、Pフレーム、Bフレームで構成されます。
    • Iフレーム (Intra-coded Picture, Keyframe): 完全に自己完結しており、他のフレームに依存せずにデコードできます。画質は最も高いですが、圧縮率は低いです。シーク(早送り・巻き戻し)は通常Iフレームの場所で行われます。
    • Pフレーム (Predictive Picture): 直前のIフレームまたはPフレームとの差分情報を用いてエンコードされます。Iフレームより圧縮率が高いです。
    • Bフレーム (Bi-predictive Picture): 直前と直後のIフレームまたはPフレームの両方との差分情報を用いてエンコードされます。最も圧縮率が高いですが、デコードには前後のフレーム情報が必要なため複雑になります。
      FFmpegでは、-g オプションでキーフレーム間の最大間隔(GOP長)を指定します。例えば -g 250 は最大250フレームごとにIフレームを挿入します(25fpsであれば10秒ごと)。keyint_minscenecut などの詳細な設定もあります。
  • プロファイル (Profile): コーデックの特定機能をまとめたセットです。互換性や性能レベルを定義します。例えばH.264にはBaseline, Main, Highなどがあります。
  • レベル (Level): コーデックで処理できる最大解像度、フレームレート、ビットレートなどを制限するパラメータです。特定のデバイスのデコード能力に合わせるために使用されます。

これらのパラメータは、コーデックの設定を通じて調整され、最終的な動画ファイルの特性を決定します。

2. 主要ビデオコーデック詳解

FFmpegがサポートする非常に多くのコーデックの中から、特に利用頻度が高く、重要度の高いものを中心に解説します。

H.264 (AVC) / libx264

  • 名称: H.264 または AVC (Advanced Video Coding)
  • FFmpeg ライブラリ: libx264 (最も一般的で高品質なソフトウェアエンコーダー)
  • 特徴: 現在最も広く普及しているビデオコーデックです。Web、ブルーレイ、放送、モバイルなど、ほぼ全てのデバイスやプラットフォームでサポートされています。H.263やMPEG-2に比べて大幅に圧縮効率が高いです。
  • メリット:
    • 高い互換性。
    • 成熟した技術であり、libx264 は非常に高品質なエンコーダーとして知られています。
    • 多くのデバイスでハードウェアデコードが可能です。
  • デメリット:
    • より新しいコーデック(H.265, AV1など)に比べると圧縮効率は劣ります。
    • 特許技術を含むため、商用利用にはライセンス料が発生する場合があります。
  • 主な用途: Webストリーミング (YouTube, Vimeoなど多くのサービスがサポート)、一般的な動画保存、互換性を重視する場合。
  • FFmpegにおける基本的な設定:

    • -c:v libx264: コーデックとしてlibx264を指定します。
    • -preset <プリセット名>: エンコード速度と圧縮効率のバランスを指定します。ultrafast, superfast, fast, medium (デフォルト), slow, slower, veryslow, placebo などがあります。slowslower は時間をかけますがより高い圧縮率/品質を得られます。placebo は実用的な品質向上はほとんどなく、速度を極端に犠牲にします。
    • -crf <数値>: ビットレート制御の方法としてCRF (Constant Rate Factor) を指定します。品質基準一定モードで、ファイルサイズは可変になります。数値が小さいほど高画質・大容量です。-crf 0 はロスレスです。一般的な範囲は 18〜28 程度で、23がデフォルトです。
    • -b:v <ビットレート>: ABR (Average Bitrate) または VBR (Variable Bitrate) の目標ビットレートを指定します。例: -b:v 2M (2 Mbps)。特定のファイルサイズや帯域幅に収めたい場合に利用します。CRFとは排他で指定します。
    • -profile:v <プロファイル名>: プロファイルを指定します。例: high, main, baseline。互換性を高めるために使用されることが多いです。
    • -level <レベル番号>: レベルを指定します。例: 4.0, 4.1。特定のデバイス要件に合わせるために使用されます。
    • -tune <チューニング名>: 特定のコンテンツタイプや用途に合わせて最適化します。例: film, animation, grain, stillimage, fastdecode, zerolatency
    • -g <GOP長>: キーフレーム間隔を指定します。
  • libx264 設定例 (Web配信用、品質重視):
    bash
    ffmpeg -i input.mp4 -c:v libx264 -preset slow -crf 21 -profile:v high -level 4.1 -c:a aac -b:a 128k output_h264.mp4

    • input.mp4: 入力ファイル
    • -c:v libx264: ビデオコーデックにlibx264を使用
    • -preset slow: エンコード速度を遅くして圧縮効率を向上
    • -crf 21: CRF値を21に設定(デフォルト23より高画質)
    • -profile:v high: Highプロファイルを指定
    • -level 4.1: レベル4.1を指定
    • -c:a aac -b:a 128k: 音声コーデックにAACを使用し、ビットレート128kbpsを指定
    • output_h264.mp4: 出力ファイル(MP4コンテナ)
  • libx264 設定例 (互換性重視、高速エンコード):
    bash
    ffmpeg -i input.mp4 -c:v libx264 -preset fast -crf 23 -profile:v main -level 3.1 -c:a copy output_h264_fast.mp4

    • -preset fast: エンコード速度を速く
    • -crf 23: デフォルトの品質
    • -profile:v main -level 3.1: より古いデバイスとの互換性が高い設定
    • -c:a copy: 音声は再エンコードせずコピー
  • libx264 設定例 (目標ビットレート指定):
    bash
    ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 3000k -maxrate 3500k -bufsize 6000k -pass 1 -f mp4 /dev/null && \
    ffmpeg -i input.mp4 -c:v libx264 -preset medium -b:v 3000k -maxrate 3500k -bufsize 6000k -pass 2 output_h264_abr.mp4

    これは2パスエンコードの例です。-b:v で平均ビットレート (3000k = 3Mbps) を指定し、-maxrate で最大ビットレート、-bufsize でバッファサイズを制御します。1パス目で解析を行い、2パス目でその結果を利用して最適なビットレート配分を行います。品質よりもファイルサイズや帯域幅の制約が厳しい場合に有効です。

H.265 (HEVC) / libx265

  • 名称: H.265 または HEVC (High Efficiency Video Coding)
  • FFmpeg ライブラリ: libx265
  • 特徴: H.264の後継として開発され、同じ画質であればH.264の約半分のビットレートで済むとされています。4K/8Kなどの高解像度コンテンツに適しています。
  • メリット:
    • H.264に比べて大幅に高い圧縮効率。
    • 高解像度コンテンツ(4K, 8K)やHDRに対応しやすい。
  • デメリット:
    • H.264ほどの互換性はありません(特に古いデバイスやソフトウェア)。
    • エンコード/デコード処理がH.264より複雑で、より高い処理能力が必要です(ハードウェア支援がない場合)。
    • ライセンス問題がH.264より複雑化しています。
  • 主な用途: 4K/8Kコンテンツの配布、ファイルサイズを最小限に抑えたい場合、最新のデバイス向けのコンテンツ。
  • FFmpegにおける基本的な設定: libx264 と類似したオプションが多く使えます。

    • -c:v libx265: コーデックとしてlibx265を指定。
    • -preset <プリセット名>: libx264 と同様 (ultrafastveryslow/placebo)。libx265 のエンコードは libx264 より時間がかかる傾向があります。
    • -crf <数値>: CRF指定。libx265 のCRFスケールは libx264 とは少し異なり、同じ数値でも得られる品質やファイルサイズは異なります。一般的な範囲は 20〜30 程度で、28がデフォルトです。-crf 0 はロスレスです。
    • -b:v <ビットレート>: ABR/VBR指定。
    • -profile:v <プロファイル名>: main, main10 (10-bit対応), main12 など。
    • -level <レベル番号>: レベル指定。
    • -tune <チューニング名>: psnr, ssim, grain, zero-latency, fast-decode など。
  • libx265 設定例 (高画質・高圧縮):
    bash
    ffmpeg -i input.mp4 -c:v libx265 -preset slow -crf 24 -c:a aac -b:a 128k output_h265.mp4

    • -c:v libx265: H.265エンコード
    • -preset slow: 時間をかけて高効率化
    • -crf 24: 品質基準(libx264 の 21 相当のファイルサイズでより高画質、または同等の画質でより小容量になることが多い)
  • libx265 設定例 (4Kエンコード):
    bash
    ffmpeg -i input_4k.mp4 -c:v libx265 -preset medium -crf 25 -c:a copy output_4k_h265.mp4

    4Kのような高解像度では、H.265の圧縮効率のメリットが特に大きくなります。

VP9 / libvpx-vp9

  • 名称: VP9
  • FFmpeg ライブラリ: libvpx-vp9
  • 特徴: Googleが開発したオープンなビデオコーデックです。ロイヤリティフリーであり、WebMコンテナとの組み合わせでWeb上での利用が進んでいます。YouTubeやニコニコ動画など、多くの主要な動画プラットフォームでサポートされています。H.265に近い圧縮効率を持つとされています。
  • メリット:
    • ロイヤリティフリー。
    • H.265に匹敵する高い圧縮効率。
    • Web用途でのサポートが進んでいます。
  • デメリット:
    • H.264ほどの普及率やハードウェアサポートはありません(近年は増加傾向)。
    • libvpx-vp9 エンコーダーは libx264/libx265 に比べてエンコード速度が遅い傾向があります。
  • 主な用途: Web動画配信(特にVP9に対応したサービス)、ロイヤリティフリーな形式を好む場合。
  • FFmpegにおける基本的な設定: libx264/libx265 とは一部オプション名が異なります。

    • -c:v libvpx-vp9: コーデックとしてlibvpx-vp9を指定。
    • -crf <数値>: CRF指定。VP9のCRFは 0〜63 の範囲で、小さいほど高画質です。一般的な範囲は 20〜35 程度です。
    • -b:v <ビットレート>: ABR/VBR指定。
    • -deadline <速度モード>: エンコード速度と品質のバランスを指定します。realtime, good (デフォルト), best があります。good は品質と速度のバランス、best は時間をかけて最高品質を目指します。
    • -tile-columns <数>: エンコードを並列化するためのタイル列数。CPUコア数に応じて調整すると高速化できます。
    • -frame-parallel <0または1>: フレームレベルでの並列化を有効にするか。
    • -row-mt <0または1>: Row-based multi-threadingを有効にするか。
  • libvpx-vp9 設定例 (WebM, 品質重視):
    bash
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 28 -b:v 0 -deadline good -c:a libopus -b:a 128k output_vp9.webm

    • -c:v libvpx-vp9: VP9エンコード
    • -crf 28: CRF指定
    • -b:v 0: CRFモードを使用する場合、-b:v 0 を指定することが推奨されます。
    • -deadline good: 品質と速度のバランスを取る
    • -c:a libopus -b:a 128k: 音声コーデックにOpusを使用(WebMコンテナでよく使われる高品質な音声コーデック)
    • output_vp9.webm: 出力ファイル(WebMコンテナ)
  • libvpx-vp9 設定例 (目標ビットレート指定、2パス):
    bash
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2000k -deadline good -pass 1 -f webm /dev/null && \
    ffmpeg -i input.mp4 -c:v libvpx-vp9 -b:v 2000k -deadline good -pass 2 output_vp9_abr.webm

    VP9で目標ビットレートを指定する場合も、通常は2パスエンコードが推奨されます。

AV1 / libaom-av1, rav1e, svt-av1

  • 名称: AV1 (AOMedia Video 1)
  • FFmpeg ライブラリ: libaom-av1, rav1e, svt-av1 など
  • 特徴: Alliance for Open Media (AOMedia) が開発したオープンでロイヤリティフリーな次世代コーデックです。H.265やVP9をさらに凌駕する高い圧縮効率を目指しています。WebMやMP4コンテナで使用可能です。
  • メリット:
    • 現在のところ最高の圧縮効率(同じ画質で最もファイルサイズが小さい可能性が高い)。
    • ロイヤリティフリー。
    • 将来の標準となる可能性が高い。
  • デメリット:
    • エンコード/デコード処理が非常に重く、H.265やVP9よりもさらに多くの処理能力が必要です(特にエンコード)。
    • ハードウェアデコードのサポートはまだ限定的ですが、徐々に増えています(新しいGPUやデバイス)。
    • エンコーダーの実装(libaom-av1, rav1e, svt-av1 など)によって特徴が異なります。libaom-av1 はAOMedia公式リファレンスですが非常に遅い。rav1e はRustで書かれており比較的高速で品質も良い。svt-av1 はIntelが中心となって開発しており、マルチコアでのスケーラビリティが高く高速ですが、品質面で他のエンコーダーに劣る場合もあります。
  • 主な用途: 極限までファイルサイズを小さくしたい場合、将来性を見据えたアーカイブ、対応デバイス向けの配信(Netflix, YouTubeなどが一部採用)。
  • FFmpegにおける基本的な設定: エンコーダーによってオプションが大きく異なります。

  • libaom-av1 設定例 (非常に時間がかかる高画質エンコード):
    bash
    ffmpeg -i input.mp4 -c:v libaom-av1 -crf 30 -cpu-used 4 -c:a libopus output_av1_aom.mkv

    • -c:v libaom-av1: libaom-av1エンコーダーを使用
    • -crf 30: CRF指定(AV1のCRFもスケールが異なります。一般的な範囲は 20〜40 程度)
    • -cpu-used <1〜8>: エンコード速度設定。数値が小さいほど時間がかかりますが高品質です。1は非常に遅い、8は最も速い。通常は 4〜6 程度が現実的です。
    • output_av1_aom.mkv: 出力ファイル(MKVコンテナが推奨されることが多いですが、MP4も可能です)
  • rav1e 設定例 (比較的バランスが良い):
    bash
    ffmpeg -i input.mp4 -c:v rav1e -qp 60 -speed 6 -c:a libopus output_av1_rav1e.mkv

    • -c:v rav1e: rav1eエンコーダーを使用
    • -qp <0〜255>: QP (Quantization Parameter) 指定。小さいほど高画質です。CRFに似ていますが少し異なります。50〜70 程度が一般的。
    • -speed <0〜10>: エンコード速度設定。数値が大きいほど速く、品質は低下します。0は最も遅く高品質、10は最も速い。通常 5〜7 程度が実用的。
  • svt-av1 設定例 (高速エンコード向き):
    bash
    ffmpeg -i input.mp4 -c:v libsvtav1 -crf 30 -preset 8 -c:a libopus output_av1_svt.mkv

    • -c:v libsvtav1: svt-av1エンコーダーを使用
    • -crf 30: CRF指定
    • -preset <0〜12>: エンコード速度設定。数値が大きいほど速く、品質は低下します。0は最も遅く高品質、12は最も速い。通常 6〜9 程度が高速化と品質のバランスが良い。

AV1はまだ発展途上のため、エンコーダーの選択や設定は目的(速度 vs 品質)に応じて慎重に行う必要があります。

プロフェッショナル向けコーデック (ProRes, DNxHD/HR)

これらのコーデックは、圧縮効率よりも編集耐性や画質維持を重視します。中間ファイルや編集作業のプロキシなどに使われます。

  • ProRes (Apple ProRes):

    • FFmpeg ライブラリ: prores, prores_ks
    • 特徴: Appleが開発したコーデックで、高い画質を維持しつつ、編集に適したフレーム内圧縮(I-frame only)を行います。ProRes 422, ProRes 4444 (アルファチャンネル対応) など複数のバージョンがあります。ファイルサイズは大きめです。
    • FFmpeg設定例:
      bash
      ffmpeg -i input.mp4 -c:v prores -profile:v standard -c:a pcm_s16le output.mov

      • -c:v prores: ProResエンコーダーを使用
      • -profile:v standard: ProRes 422 Standard プロファイルを指定 (proxy, lt, standard, hq などがあります)
      • -c:a pcm_s16le: 非圧縮PCMオーディオ(編集向け)
      • output.mov: MOVコンテナが一般的
  • DNxHD/HR (Avid DNxHD/DNxHR):

    • FFmpeg ライブラリ: dnxhd
    • 特徴: Avid Technologyが開発したコーデックで、ProResと同様に編集に適したI-frame only圧縮を行います。DNxHDはHD解像度向け、DNxHRはそれ以上の解像度(4Kなど)向けです。ProResと並んでプロフェッショナル編集の現場で広く使われています。
    • FFmpeg設定例:
      bash
      ffmpeg -i input.mp4 -c:v dnxhd -profile:v dnxhr_hq -c:a pcm_s16le output.mov

      • -c:v dnxhd: DNxHD/HRエンコーダーを使用
      • -profile:v dnxhr_hq: DNxHR HQ (High Quality) プロファイルを指定 (dnxhr_lb, dnxhr_sq, dnxhr_hq, dnxhr_hqx, dnxhr_444 などがあります)

これらのコーデックは、最終的な配布形式としてはあまり使われず、編集ワークフローの中間ステップとして非常に有用です。

ロスレス/可逆圧縮コーデック (FFV1, Ut Video)

これらのコーデックは、画質の劣化を一切伴わずに圧縮します。主にアーカイブ目的や、後の処理のために元の品質を完全に保持したい場合に使用されます。ファイルサイズは非常に大きくなります。

  • FFV1:

    • FFmpeg ライブラリ: ffv1
    • 特徴: FFmpegプロジェクト自身によって開発された、ロイヤリティフリーのロスレスビデオコーデックです。アーカイブ用途での利用が推奨されています。バージョンによって対応する機能が異なります。
    • FFmpeg設定例:
      bash
      ffmpeg -i input.mp4 -c:v ffv1 -level 3 -c:a copy output.mkv

      • -c:v ffv1: FFV1エンコーダーを使用
      • -level 3: FFV1 Level 3を指定(最新かつ高効率)
      • output.mkv: MKVコンテナが推奨されます
  • Ut Video:

    • FFmpeg ライブラリ: utvideo
    • 特徴: Yuta Odaka氏によって開発されたロスレスコーデックです。高速なエンコード・デコードが特徴です。
    • FFmpeg設定例:
      bash
      ffmpeg -i input.mp4 -c:v utvideo -c:a copy output.mkv

H.264やH.265もCRFを0に設定することで技術的にはロスレスエンコードが可能ですが、FFV1やUt Videoはロスレスに特化しており、通常はこちらの方が効率が良いか、特定の用途(アーカイブなど)に適しています。

その他

  • MPEG-2 / mpeg2video:
    • DVDや古いデジタル放送などで使用される古いコーデックです。互換性は高いですが、圧縮効率は現代のコーデックに劣ります。レガシーシステムとの連携や、DVD作成などで使用されることがあります。
    • 例: ffmpeg -i input.mp4 -c:v mpeg2video -q:v 3 -c:a mp2 output.mpg (-q:v で品質指定, 小さいほど高画質)
  • MJPEG (Motion JPEG) / mjpeg:
    • 各フレームを独立したJPEG画像としてエンコードする形式です。フレーム間圧縮を行わないため、編集耐性は高いですが、圧縮効率は非常に悪いです。古いビデオカメラやキャプチャーデバイスで使われることがあります。
    • 例: ffmpeg -i input.mp4 -c:v mjpeg -q:v 3 -c:a copy output.avi (-q:v で品質指定)
  • 画像シーケンス / png, jpeg, tiff:
    • 動画を連番の静止画ファイルとして出力することも可能です。アニメーション制作やVFXワークフローで中間素材として使われることがあります。
    • 例: ffmpeg -i input.mp4 -c:v png output_%04d.png (連番PNG画像として出力)

3. 適切なビデオコーデックの選び方

どのビデオコーデックを選ぶかは、主に以下の要因によって決定されます。

  1. 利用目的: 最終的にその動画をどのように利用したいか。

    • Webストリーミング: ファイルサイズを小さくしつつ、多くのデバイスで再生できる高い互換性が求められます。H.264 (libx264) が最も無難で広く使われます。より高画質/高圧縮を目指すなら H.265 (libx265) や VP9 (libvpx-vp9)、最新なら AV1 が選択肢になりますが、再生環境のサポートを確認する必要があります。YouTubeやNetflixのような大手プラットフォームは、同じ動画を複数のコーデック・解像度で用意するアダプティブストリーミングを採用しています。
    • アーカイブ: 将来にわたって劣化なく保存したい場合は、ロスレスコーデック (FFV1, Ut Video) が最適です。容量は大きくなります。高圧縮で保存したいが多少の劣化は許容できる場合は、H.265 や AV1 を高い品質設定 (低いCRF値) でエンコードします。
    • 動画編集: 編集ソフトでの扱いの容易さ、シーク性能、多重トラック編集時のパフォーマンスが重要です。編集向けコーデック (ProRes, DNxHD/HR) や、フレーム間圧縮の少ないコーデックが適しています。元の映像の品質を劣化させたくない場合は、ロスレスコーデックや、編集ソフトがネイティブ対応している高ビットレートコーデックを選びます。
    • 放送/業務用: 特定の放送規格や納品仕様でコーデックが指定されていることが多いです(例: MPEG-2, H.264, ProRes, DNxHDなど)。
    • 画面録画: PC画面の内容(テキストやUI要素など)は、通常のカメラ映像とは特性が異なります。可逆圧縮に近いH.264/H.265の設定(低いCRF、特定のチューニングなど)や、専用コーデック(例: Lagarith,ありますがFFmpegのソフトウェアエンコーダーとしては利用しにくい)が使われることがあります。高いフレームレートと低い遅延が求められる場合もあります。
    • 特定のデバイス向け: 特定のスマートフォン、タブレット、ゲーム機、レガシー機器などで再生する場合、そのデバイスがサポートするコーデック、プロファイル、レベルを確認する必要があります。
  2. 再生環境/互換性: 誰が、どのようなデバイスでその動画を再生するか。

    • 最も多くの人に届けたいなら、H.264一択です。
    • 最新のPCやスマートフォン、対応するメディアプレーヤーであれば、H.265やVP9も選択肢に入ります。
    • AV1はまだハードウェアサポートが限定的なため、ソフトウェアデコードに頼ることになり、古い/低スペックなデバイスではスムーズに再生できない可能性があります。
  3. 画質要件: どの程度の画質を求めるか。

    • 最高の画質を求めるならロスレス。
    • 配布用で可能な限り高画質にしたいなら、H.265, VP9, AV1 を選択し、適切なビットレートまたはCRFを設定します。H.264も高いビットレート/低いCRFで高品質になりますが、同じファイルサイズなら新しいコーデックの方が通常は高品質になります。
  4. ファイルサイズ: どの程度ファイルサイズを小さくする必要があるか。

    • 圧縮効率を優先するなら、AV1 > H.265 ≈ VP9 > H.264 > MPEG-2 > MJPEG > ロスレス の順になります。
    • ファイルサイズは主にコーデックとビットレート(またはCRF)によって決まります。
  5. エンコード/デコード速度: エンコードにかかる時間や、再生時のCPU負荷を気にするか。

    • 一般的に、圧縮効率が高いコーデックほどエンコード/デコードに時間がかかり、高い処理能力を要求します。
    • H.264が比較的バランスが良く、H.265, VP9, AV1 と新しいものほど重くなる傾向があります(エンコーダーの実装にもよります)。
    • 高速性を重視する場合、ハードウェアアクセラレーションが可能なコーデック(H.264, H.265, VP9など)を選択するのが最も効果的です。
  6. ライセンス: ロイヤリティフリーである必要があるか。

    • H.264, H.265 は特許技術を含むため、商用利用にはライセンス費用が発生する可能性があります。
    • VP9, AV1, FFV1 はロイヤリティフリーです。

これらの要因を総合的に考慮して、最適なコーデックを選択します。多くの場合、H.264から始めて、必要に応じてH.265やVP9、AV1などを検討するのが現実的なアプローチです。

4. FFmpegにおける一般的なビデオエンコード設定

FFmpegでビデオエンコードを行う際に、多くのコーデックに共通する、あるいは頻繁に使用される設定オプションについて解説します。

ビットレート制御 (Rate Control)

エンコード後のファイルサイズや品質を制御する最も重要な設定の一つです。

  • CRF (Constant Rate Factor):

    • -crf <数値> (libx264, libx265, libaom-av1, libsvtav1など多くのコーデックで使用)
    • 目標とする「知覚的な画質」を一定に保つモードです。映像の内容に応じてビットレートが可変するため、ファイルサイズは予測しにくいですが、指定した品質レベルを効率的に達成できます。
    • 数値が小さいほど高画質になり、ファイルサイズが大きくなります。
    • 例: libx264 では 0 (ロスレス) 〜 51 (最低画質)、デフォルトは 23。通常は 18〜28 の間で調整。
    • 例: libx265 では 0 (ロスレス) 〜 51 (最低画質)、デフォルトは 28。通常は 20〜30 の間で調整。
    • 例: libvpx-vp9 では 0 (ロスレス) 〜 63 (最低画質)。通常は 20〜35 の間で調整。
    • 多くのケースで、ABRよりも高品質かつ効率的な圧縮結果が得られるため、特定のファイルサイズ要件がない場合はCRFが推奨されます。-b:v とは排他です。
  • ABR (Average Bitrate):

    • -b:v <ビットレート>
    • 目標とする平均ビットレートを指定するモードです。ファイルサイズをある程度予測・制御できますが、シーンによって画質にばらつきが出る可能性があります。
    • 通常、より安定した品質を得るために2パスエンコードと組み合わせて使用されます。
    • 例: -b:v 5M (5 Mbps), -b:v 5000k (同じ意味)
    • 帯域幅やストレージ容量に明確な制限がある場合に有効です。
  • VBR (Variable Bitrate):

    • 広義にはCRFやABRもVBRの一種ですが、FFmpegの文脈ではビットレートの最小/最大値を指定したり、品質とビットレートの両方を目標とするモードを指すことがあります。
    • -minrate <ビットレート>, -maxrate <ビットレート>: 最小/最大ビットレートを制限します。ABRと組み合わせて、平均ビットレートを目標としつつ、急激なビットレート変動を抑えたい場合に利用します。
    • -bufsize <サイズ>: ビデオバッファサイズを指定します。デコーダーがスムーズに再生するために必要なバッファ量を定義し、ビットレートの変動を制御します。-maxrate と組み合わせて使用します。例: -bufsize 10M

プリセット (Preset)

  • -preset <プリセット名> (libx264, libx265, libsvtav1など)
  • エンコード速度と圧縮効率(または品質)のバランスを簡単に調整するための設定の集合体です。時間がかかる設定ほど、同じ画質ならファイルサイズが小さく、同じファイルサイズなら画質が高くなります。
  • 一般的なプリセット名 (速度順): ultrafast, superfast, fast, medium (デフォルト), slow, slower, veryslow, placebo
  • 最初は mediumslow あたりで試してみて、必要に応じて調整するのが良いでしょう。ultrafastsuperfast はエンコードは非常に速いですが、ファイルサイズが大きくなったり画質が低下したりします。

プロファイルとレベル (Profile and Level)

  • -profile:v <プロファイル名>
  • -level <レベル番号>
  • これらの設定は、主にH.264やH.265などの規格ベースのコーデックで使用されます。特定の機能セット(プロファイル)や最大性能(レベル)を制限することで、古いデバイスや特定の仕様(例: Blu-ray規格)への互換性を確保するために使用されます。
  • 例: H.264の high プロファイルはBフレームやCABACなど高効率な機能を使いますが、baseline プロファイルはこれらの機能を含まず、低機能なデバイス向けです。

キーフレーム間隔 (GOP Structure)

  • -g <フレーム数>: キーフレーム(Iフレーム)間の最大フレーム間隔を指定します。例えば、25fpsの映像で -g 250 なら最大10秒ごとにIフレームが挿入されます。
  • キーフレームが多いほどシーク性能は向上しますが、圧縮効率は低下します。Webストリーミングではシーク性能のために短いGOP (例: 2〜4秒程度、フレームレートの2倍〜4倍の値) が推奨されることが多いです。編集用の中間ファイルは、すべてのフレームをIフレームにする (GOP=1 に近い設定、例: ProRes, DNxHD/HR) こともあります。
  • -keyint_min <フレーム数>: キーフレーム間の最小フレーム間隔。
  • -scenecut <割合>: シーンチェンジを検出して強制的にキーフレームを挿入するかどうか。デフォルトは 40 (40%) で、libx264/libx265では有効になっています。

スレッド設定 (Threading)

  • -threads <数値>: エンコードに使用するCPUスレッド数を指定します。auto (または省略) で自動的にコア数に合わせた最適な数が設定されることが多いですが、手動で制限することも可能です。通常は自動設定で問題ありません。

ピクセルフォーマット (Pixel Format)

  • -pix_fmt <フォーマット名>: 映像のピクセルフォーマット(色の表現形式とサブサンプリング方式)を指定します。例: yuv420p (最も一般的で互換性が高い、Web動画などで使用), yuv422p, yuv444p, rgb24 など。
  • 色の正確さを重視するプロフェッショナル用途では yuv422pyuv444p が使われることがありますが、ファイルサイズは大きくなります。多くの一般的なコーデックやデバイスは yuv420p のみをサポートしています。10-bitエンコードを行う場合は yuv420p10le などを指定します。

その他の重要なオプション

  • -s <WxH>: 解像度を指定してリサイズします。例: -s 1280x720
  • -r <fps>: フレームレートを指定します。例: -r 30
  • -aspect <アスペクト比>: アスペクト比を指定します。例: -aspect 16:9
  • -vf <フィルターグラフ>: 映像フィルターを適用します。リサイズ、クロップ、デインターレース、色調補正など、FFmpegの強力なフィルター機能を使う場合に指定します。例: -vf scale=1280:720,eq=contrast=1.2 (リサイズとコントラスト調整)
  • -an: 音声ストリームを含めない。
  • -vn: 映像ストリームを含めない。
  • -sn: 字幕ストリームを含めない。
  • -map <入力ファイルインデックス>:<ストリームインデックス>: 入力ファイルのどのストリームを出力に含めるか、または出力ストリームの順番を指定します。

5. ハードウェアアクセラレーション

ソフトウェアエンコードはCPUの処理能力に依存するため、特に高解像度や高フレームレートの動画エンコードは非常に時間がかかります。現代の多くのGPUや一部のCPUには、特定のビデオコーデック(主にH.264, H.265, VP9)専用のハードウェアエンコーダー/デコーダーが搭載されており、これを利用することでエンコード速度を劇的に向上させることができます。これをハードウェアアクセラレーションと呼びます。

FFmpegは、様々なプラットフォームのハードウェアアクセラレーションAPIをサポートしています。

  • NVIDIA: NVENC (Encoder) / NVDEC (Decoder)
    • -c:v h264_nvenc, -c:v hevc_nvenc
  • Intel: Quick Sync Video (QSV)
    • -c:v h264_qsv, -c:v hevc_qsv, -c:v vp9_qsv
  • AMD: VCE (Video Coding Engine) / VCN (Video Core Next)
    • -c:v h264_amf (Windows), -c:v hevc_amf (Windows) または VAAPI (Linux)
  • Linux (汎用): VAAPI (Video Acceleration API)
    • -c:v h264_vaapi, -c:v hevc_vaapi, -c:v vp9_vaapi
    • デコードにも h264_vaapi などのデコーダー名を使います。フィルター処理をGPUで行うために-hwaccel vaapi オプションと組み合わせることもあります。
  • macOS: VideoToolbox
    • -c:v h264_videotoolbox, -c:v hevc_videotoolbox

ハードウェアエンコードの注意点:

  • 品質: 一般的に、同等設定のソフトウェアエンコーダー(特にlibx264veryslow プリセットなど)に比べて、ハードウェアエンコーダーは圧縮効率や画質がわずかに劣る傾向があります。これは、ハードウェアが固定機能回路であるため、ソフトウェアエンコーダーのように複雑な最適化処理を行うことが難しい場合があるためです。ただし、新しい世代のハードウェアエンコーダーは品質が大幅に向上しています。
  • 機能: ソフトウェアエンコーダーが提供するすべての詳細な設定オプション(例: libx264 の多くのチューニングオプション)が、ハードウェアエンコーダーでは利用できない場合があります。
  • 互換性: 使用しているFFmpegのビルドが、利用したいハードウェアアクセラレーションに対応している必要があります。また、グラフィックドライバーも適切にインストールされている必要があります。
  • フィルター処理: FFmpegのフィルター (-vf) を使用する場合、通常はデコード後の生データに対して処理が行われるため、ハードウェアデコードとソフトウェアフィルター、ソフトウェアエンコードの組み合わせになります。フィルター処理もハードウェアで行いたい場合は、VAAPIのようなハードウェアデバイスコンテキストを介した処理 (-hwaccel <api>, -hwaccel_output_format <format>, -vf 'format=<format>,hwupload,scale_vaapi=...' のような複雑なコマンド) が必要になる場合があります。

ハードウェアエンコードの基本的なコマンド構造:

bash
ffmpeg -i input.mp4 -c:v <ハードウェアエンコーダー名> [エンコーダー固有オプション] -c:a copy output.mp4

例 (NVIDIA NVENC):
bash
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p5 -cq 25 -c:a copy output_nvenc.mp4

* -c:v h264_nvenc: NVENC H.264エンコーダーを使用
* -preset p5: NVENCのプリセット (p1〜p7, p1が最も遅く高品質、p7が最も速い、p5がデフォルト)
* -cq 25: NVENCのQuality level (CRFに似た概念、小さいほど高品質)

ハードウェアアクセラレーションは、速度が最優先されるユースケース(リアルタイム処理、多数の動画を一括処理など)において非常に有効です。

6. 実践!FFmpeg コマンド例

これまで解説した知識を踏まえ、具体的なエンコードシナリオに応じたFFmpegコマンド例をいくつか紹介します。

これらの例は基本的なものです。必要に応じて、解像度 (-s), フレームレート (-r), アスペクト比 (-aspect), フィルター (-vf), GOP (-g), 音声設定 (-c:a, -b:a), 字幕 (-c:s, -sn), メタデータなどを追加・調整してください。

例1:Web配信用(H.264、標準的な品質と互換性)

多くのデバイスで再生できるH.264を使用します。CRF 23はデフォルト品質です。

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

* -preset medium: 標準的な速度と品質バランス。
* -crf 23: 標準的な品質。
* -c:a aac -b:a 128k: 音声はAAC、128kbps(Webで一般的な設定)。

例2:Web配信用(H.265、ファイルサイズ重視)

H.265でより高圧縮を目指します。CRF値はH.264より大きめに設定します(同じ数値でもH.265の方が高圧縮になる傾向があるため)。互換性はH.264より低いことに注意。

bash
ffmpeg -i input.mp4 -c:v libx265 -preset medium -crf 28 -c:a aac -b:a 128k output_web_h265.mp4

* -preset medium: 標準的な速度と品質バランス。H.265はエンコードが重いため、slow はさらに時間がかかります。
* -crf 28: H.265の標準的な品質。

例3:Web配信用(VP9、ロイヤリティフリー)

ロイヤリティフリーのVP9を使用し、WebMコンテナに出力します。音声はOpusが推奨されます。

bash
ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -deadline good -c:a libopus -b:a 128k output_web_vp9.webm

* -crf 30: VP9のCRF値。
* -b:v 0: CRFモードでのVP9エンコードの推奨設定。
* -deadline good: 速度と品質のバランス。
* -c:a libopus: オーディオコーデックにOpusを使用。

例4:アーカイブ用(ロスレス、FFV1)

画質劣化なく保存します。ファイルサイズは大きくなります。

bash
ffmpeg -i input.mp4 -c:v ffv1 -level 3 -c:a copy output_archive_ffv1.mkv

* -c:v ffv1 -level 3: FFV1 Level 3エンコード。
* -c:a copy: 音声はコピー(ロスレスにする必要がなければコピーで十分)。

例5:アーカイブ用(高画質H.265)

ロスレスではないが、配布用よりはるかに高画質にH.265で保存します。

bash
ffmpeg -i input.mp4 -c:v libx265 -preset veryslow -crf 18 -pix_fmt yuv420p10le -c:a copy output_archive_h265.mkv

* -preset veryslow: 最高レベルの圧縮効率を目指して時間をかけます。
* -crf 18: H.265としては非常に低いCRF値(高画質)。
* -pix_fmt yuv420p10le: 10-bitカラーでエンコードし、バンディング(階調の縞模様)を軽減。

例6:動画編集向けプロキシ作成(ProRes LT)

編集ソフトでの扱いやすさを重視したProRes LTプロキシを作成します。

bash
ffmpeg -i input.mp4 -c:v prores -profile:v lt -c:a pcm_s16le output_proxy_proreslt.mov

* -c:v prores -profile:v lt: ProRes LTプロファイルを使用。
* -c:a pcm_s16le: 非圧縮リニアPCM音声。

例7:解像度変換とエンコード(H.264)

入力動画を720pにリサイズしながらH.264エンコードします。

bash
ffmpeg -i input.mp4 -vf scale=1280:720 -c:v libx264 -preset medium -crf 23 -c:a copy output_720p_h264.mp4

* -vf scale=1280:720: 映像フィルターで解像度を1280×720に変更。

例8:フレームレート変換とエンコード(H.264)

入力動画を30fpsに変換しながらH.264エンコードします。

bash
ffmpeg -i input.mp4 -r 30 -c:v libx264 -preset medium -crf 23 -c:a copy output_30fps_h264.mp4

* -r 30: フレームレートを30fpsに設定。

例9:ハードウェアアクセラレーション(NVENC、H.264)

NVIDIA GPUのNVENCを使って高速エンコードします。

bash
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p5 -cq 25 -c:a copy output_nvenc.mp4

* -c:v h264_nvenc: NVENC H.264エンコーダーを使用。
* -preset p5: NVENCのデフォルトプリセット。
* -cq 25: 品質レベルを指定 (CRFに似ています)。

例10:ハードウェアアクセラレーション(VAAPI、H.264、フィルターあり)

Linux環境でVAAPIを使い、GPU上でリサイズフィルターも適用しながらエンコードします。やや複雑なコマンドになります。

bash
ffmpeg -hwaccel vaapi -hwaccel_output_format vaapi -i input.mp4 -vf 'format=nv12|vaapi,hwupload,scale_vaapi=1280:720' -c:v h264_vaapi -qp 25 -c:a copy output_vaapi.mp4

* -hwaccel vaapi -hwaccel_output_format vaapi: ハードウェアアクセラレーションにVAAPIを使用し、VAAPI形式でデータを扱う。
* -vf '...': フィルターグラフ。
* format=nv12|vaapi: 入力フォーマットをVAAPIで扱いやすいように変換。
* hwupload: 映像データをGPUメモリにアップロード。
* scale_vaapi=1280:720: VAAPIを使ってGPU上でリサイズを実行。
* -c:v h264_vaapi: VAAPI H.264エンコーダーを使用。
* -qp 25: VAAPIエンコーダーの品質設定(QP値、小さいほど高画質)。

これらの例は出発点です。FFmpegのドキュメント(ffmpeg -h encoder=<エンコーダー名> やオンラインドキュメント)を参照して、さらに詳細なオプションやチューニング方法を調べてみてください。

7. トラブルシューティングとヒント

  • エンコード速度が遅い:
    • より高速なプリセット (-preset fast など) を試す。
    • ハードウェアアクセラレーションが利用可能か確認し、対応するコーデックとオプションを使用する。
    • CPU使用率を確認し、システムリソースがボトルネックになっていないか確認する。
    • ビデオフィルターを多数使用している場合は、それらが速度に影響している可能性がある。
  • 出力ファイルサイズが大きすぎる/小さすぎる:
    • CRF値を調整する(大きくすると小さく、小さくすると大きくなる)。
    • ABRを使用している場合は、目標ビットレート (-b:v) を調整する。
    • プリセットをより圧縮効率の高いもの (-preset slow など) に変更する。
  • 画質が悪い:
    • CRF値を小さくする、またはABRで目標ビットレートを上げる。
    • プリセットをより高品質なもの (-preset slow など) に変更する。
    • 入力ソース自体の画質を確認する。
    • インターレース解除など、適切なフィルターが適用されているか確認する。
  • 再生できない、または問題がある:
    • 出力ファイルのコンテナとコーデックが、再生環境でサポートされているか確認する。
    • プロファイルやレベル設定が、再生環境の制限を超えていないか確認する。
    • ハードウェアエンコードを使用している場合、ソフトウェアエンコードで試して問題が解決するか確認する(ハードウェアエンコーダーの制限の可能性)。
    • FFmpegのバージョンが古い場合、最新版にアップデートしてみる。
  • コマンドオプションが分からない:
    • ffmpeg -h encoder=<コーデック名> でそのコーデックの利用可能なオプションを確認する。
    • FFmpegの公式ドキュメントをオンラインで参照する。
  • CRFとビットレートの関係:
    • CRFは品質基準、ビットレートはファイルサイズ基準です。どちらか一方を選びます。品質を優先するならCRF、ファイルサイズを厳密に制御するならABR(2パス推奨)を選びます。

8. まとめと将来展望

本記事では、FFmpeg におけるビデオコーデックの役割、主要なコーデック(H.264, H.265, VP9, AV1, プロフェッショナル向け, ロスレスなど)の特徴とFFmpegでの設定方法、そして利用目的や環境に応じた適切なコーデックの選び方について詳細に解説しました。

ビデオコーデックの選択は、互換性、品質、ファイルサイズ、エンコード速度というトレードオフの中で、最も重要な要素の一つです。

  • 互換性最優先なら: H.264 (libx264)
  • 高圧縮・高品質(互換性は二の次)なら: H.265 (libx265) または VP9 (libvpx-vp9)
  • さらに高い圧縮率と将来性(エンコードは重い)なら: AV1 (libaom-av1, rav1e, svt-av1)
  • 編集耐性・高画質維持なら: ProRes, DNxHD/HR
  • ロスレスアーカイブなら: FFV1, Ut Video

エンコード設定においては、CRF/ABRによるビットレート制御、Presetによる速度/品質バランス、Profile/Levelによる互換性、GOP構造によるシーク性能などが重要なパラメータとなります。また、ハードウェアアクセラレーションを利用することでエンコード時間を大幅に短縮できる場合があります。

FFmpegは非常に強力で柔軟なツールですが、その分オプションも膨大です。本記事が提供する情報は基本的な部分ですが、これを足がかりに、目的とする動画に最適なコーデックと設定を見つけ出すための助けとなれば幸いです。

ビデオコーデック技術は常に進化しています。AV1の普及が進み、その後継となるVVC (Versatile Video Coding, H.266) の開発も進んでいます。FFmpegもこれらの新しい技術に常に対応していくため、今後もその機能は拡張されていくでしょう。

動画エンコードは奥深い分野ですが、FFmpegを使えば非常に細かな制御が可能です。ぜひ色々なコーデックや設定を試して、最適なワークフローを見つけてください。


コメントする

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

上部へスクロール