32blogby StudioMitsu
ffmpeg12 min read

FFmpegをGPUで高速化する完全ガイド

NVIDIA NVENC、Intel QSV、AMD AMFの3つのGPUエンコーダーをFFmpegで使う方法を比較解説。セットアップから実測ベンチマークまで網羅。

FFmpegGPUNVENCQSV動画エンコード高速化
目次

4K動画を1本エンコードするのに30分かかっていた。GPUエンコードに切り替えたら3分になった。これが僕の体験だ。

FFmpegはデフォルトでCPUを使ってエンコードする。CPUエンコードは画質が高い反面、処理が重い。一方で、NVIDIAのNVENC、IntelのQSV(Quick Sync Video)、AMDのAMFといったGPUエンコーダーを使うと、速度は劇的に上がる。この記事では、それぞれのGPUエンコーダーのセットアップ方法と使い方、そして画質・速度のトレードオフを実測ベンチマークをもとに解説する。

CPUエンコードの限界

まず前提として、なぜCPUエンコードが「遅い」のかを理解しておこう。

CPUは汎用プロセッサーで、コア数は多くても数十個だ。動画エンコードは大量の並列演算が必要な処理で、CPUのコアでこれをこなすには時間がかかる。たとえばx264(H.264のCPUエンコーダー)の slow プリセットで4K動画を処理すると、リアルタイムの3〜5倍の時間がかかることは珍しくない。

GPUは逆に、数千のシェーダーコアを持つ並列演算特化の設計だ。GPUエンコーダーはこのアーキテクチャを活かし、専用のエンコードエンジン(NVIDIAならNVENCチップ)で動画圧縮を処理する。結果として、CPUの10〜20倍のスループットが出ることもある。

ただし、速度と引き換えにトレードオフがある。GPUエンコーダーは「専用シリコン」で動くため、CPUエンコーダーほど高度な圧縮アルゴリズムを実行できない。同じビットレートなら、CPUエンコードのほうが画質は上になることが多い。これは後の章で詳しく説明する。

GPUエンコーダー3種の違い

NVENC、QSV、AMFの3つを簡単に整理しておこう。

エンコーダーメーカー対象GPUFFmpegのコーデック名
NVENCNVIDIAGeForce GTX 16xx以降, RTX 20xx以降h264_nvenc / hevc_nvenc / av1_nvenc
QSVIntelCore iシリーズ内蔵GPU(第6世代以降), Arc GPUh264_qsv / hevc_qsv / av1_qsv
AMFAMDRadeon RX 5000以降h264_amf / hevc_amf / av1_amf

それぞれ専用のエンコードエンジンを持ち、CPUに負荷をほぼかけずにエンコードが走る。複数のGPUがある場合(例:CPU内蔵のIntel QSV + 外付けNVIDIA GPU)は、同時に別々のタスクで使い分けることも可能だ。

コーデック対応状況についても補足しておく。AV1エンコードはNVIDIA RTX 4000以降、Intel Arc、AMD RX 7000以降でのみ対応している。それより古いGPUはH.264とH.265(HEVC)のみとなる。

NVIDIA NVENCのセットアップと使い方

事前確認

まず、自分のFFmpegがNVENCに対応しているかを確認する。

bash
ffmpeg -encoders | grep nvenc

以下のような出力が出れば対応済みだ。

bash
 V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V....D hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
 V....D av1_nvenc            NVIDIA NVENC av1 encoder (codec av1)

何も出ない場合は、FFmpegのビルドがNVENCを含んでいないか、NVIDIAドライバーが古い。ドライバーは最新版(550以降推奨)にしておこう。

H.264 NVENCの基本コマンド

bash
ffmpeg -i input.mp4 \
  -c:v h264_nvenc \
  -preset p4 \
  -cq 23 \
  -b:v 0 \
  -c:a copy \
  output_nvenc_h264.mp4

主要オプションの説明:

  • -c:v h264_nvenc — NVENCのH.264エンコーダーを指定
  • -preset p4 — エンコード速度と画質のバランス。p1(最速)〜p7(最高画質)
  • -cq 23 — 品質ベースのエンコード(CQモード)。値が小さいほど高画質。18〜28が実用域
  • -b:v 0 — CQモードを有効にするため、ターゲットビットレートを0に設定

H.265(HEVC)NVENCコマンド

H.264より高圧縮率が必要な場合はHEVCを使う。ファイルサイズを約40〜50%削減できる。

bash
ffmpeg -i input.mp4 \
  -c:v hevc_nvenc \
  -preset p5 \
  -cq 28 \
  -tag:v hvc1 \
  -c:a copy \
  output_nvenc_hevc.mp4

-tag:v hvc1 はApple製品(iPhone、Mac)での再生互換性のために追加している。

NVENC使用時の注意点

NVIDIAのGPUには同時エンコードセッション数の制限がある。GeForceシリーズ(RTXを含む)は最大3セッションまで(ドライバーのアンロックパッチを使わない限り)。QuadroやRTX Professionalシリーズには制限がない。複数の動画を並列処理する場合は注意しよう。

Intel QSVのセットアップと使い方

事前確認

QSVの対応確認コマンドは以下。

bash
ffmpeg -encoders | grep qsv

LinuxでQSVを使うには intel-media-va-driver または intel-media-driver が必要だ。Ubuntuなら以下でインストールできる。

bash
sudo apt install intel-media-va-driver-non-free vainfo
vainfo  # 認識されたVAAPI対応デバイスを確認

H.264 QSVの基本コマンド

bash
ffmpeg -i input.mp4 \
  -c:v h264_qsv \
  -preset medium \
  -global_quality 23 \
  -look_ahead 1 \
  -c:a copy \
  output_qsv_h264.mp4
  • -preset medium — QSVはveryfast / faster / fast / medium / slow / veryslow の6段階
  • -global_quality 23 — QSVの品質ベースエンコード。CRFに相当する値
  • -look_ahead 1 — ルックアヘッドバッファを有効化。画質が向上するが若干遅くなる

QSVは特にノートPC小型PCでの動画処理に強い。GPU本体がなくても、IntelのCPU内蔵グラフィックスだけで高速エンコードができる。消費電力も低い。

AMD AMFのセットアップと使い方

事前確認

AMFの対応確認コマンドは以下。

bash
ffmpeg -encoders | grep amf

WindowsではRadeonドライバーのインストールだけで使える。Linuxは現時点でAMFのサポートが限定的で、Mesa VAAPIドライバー経由の h264_vaapi / hevc_vaapi を代わりに使うケースが多い。

H.264 AMFの基本コマンド

bash
ffmpeg -i input.mp4 \
  -c:v h264_amf \
  -quality balanced \
  -qp_i 22 -qp_p 24 -qp_b 26 \
  -c:a copy \
  output_amf_h264.mp4
  • -quality balanced — AMFのプリセット。speed / balanced / quality の3段階
  • -qp_i / -qp_p / -qp_b — Iフレーム・Pフレーム・Bフレームそれぞれの量子化パラメーター

AMFは現状、NVENCやQSVと比較して画質面で若干見劣りすることが多い。AMDも世代ごとに改善を進めているが、特にBフレームの扱いがNVENCより制限されている。ゲーム配信のようなリアルタイム用途では十分な品質だが、マスタリング用途にはやや不向きだ。

画質 vs 速度のトレードオフ

GPUエンコードの最大のデメリットは画質だ。同じCQ/QP値でも、CPUエンコーダーと比べると圧縮効率が落ちる。なぜかというと、GPUの専用エンコードシリコンはリアルタイム処理を優先した設計になっており、CPUエンコーダーが使う高度な動き予測(マクロブロック分割の最適化など)が省略されているためだ。

どちらを選ぶかの目安:

用途推奨エンコーダー
ゲーム実況のリアルタイム録画NVENC / QSV(速度優先)
YouTubeアップロード用の変換NVENC p5〜p6 / QSV slow(バランス)
保存用マスターファイル作成x264 / x265 slow(画質優先)
Blu-rayリッピング後の圧縮x265 veryslow / SVT-AV1(画質優先)
大量ファイルの一括変換NVENC / QSV(スループット優先)

SVT-AV1を使った高効率エンコードについては FFmpeg v8 + SVT-AV1の最適設定ガイド で詳しく解説している。

ベンチマーク比較

以下は、同一の4K 30fps ソース動画(10分)を各エンコーダーで変換した際の実測値だ。環境はWindows 11、CPU: Core i9-13900K、GPU: RTX 4080、RAM: 32GB。

エンコーダープリセットエンコード時間出力サイズVMAF スコア
x264slow28分14秒2.1 GB94.2
x265slow41分03秒1.2 GB94.8
h264_nvencp52分41秒2.6 GB91.3
hevc_nvencp52分58秒1.5 GB91.7
h264_qsvmedium3分22秒2.8 GB90.1
h264_amfbalanced3分08秒2.9 GB89.4

VMAFはNetflixが開発した知覚品質スコア(0〜100、高いほど良い)。この数値は参考値で、ソース素材やGPUの世代によって大きく変わる。

自分の環境でベンチマークを取るなら、以下のコマンドが便利だ。エンコード時間はFFmpegのログ末尾に表示される speed= の値から計算できる。

bash
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p5 -cq 23 -b:v 0 -c:a copy output.mp4 -benchmark

-benchmark フラグをつけると、実行後にCPU使用時間やシステム時間の詳細が出力される。

まとめ

GPUエンコードは、速度を優先する用途で強力な選択肢だ。NVIDIAのNVENCが最もバランスがよく、画質・速度・対応状況のどれもトップクラス。IntelのQSVはノートPCや低消費電力環境で光る。AMDのAMFはWindows環境ではすぐ使えるが、画質面でまだ追いかけている状況だ。

用途に応じて使い分けが大事で、保存用マスターには引き続きCPUエンコードが適している。一方で「とにかく速く変換したい」「リアルタイム録画したい」という場面では、GPUエンコードを積極的に活用してほしい。

FFmpegのインストール自体がまだという場合は FFmpegインストールガイド から始めよう。