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つを簡単に整理しておこう。
| エンコーダー | メーカー | 対象GPU | FFmpegのコーデック名 |
|---|---|---|---|
| NVENC | NVIDIA | GeForce GTX 16xx以降, RTX 20xx以降 | h264_nvenc / hevc_nvenc / av1_nvenc |
| QSV | Intel | Core iシリーズ内蔵GPU(第6世代以降), Arc GPU | h264_qsv / hevc_qsv / av1_qsv |
| AMF | AMD | Radeon 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に対応しているかを確認する。
ffmpeg -encoders | grep nvenc
以下のような出力が出れば対応済みだ。
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の基本コマンド
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%削減できる。
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の対応確認コマンドは以下。
ffmpeg -encoders | grep qsv
LinuxでQSVを使うには intel-media-va-driver または intel-media-driver が必要だ。Ubuntuなら以下でインストールできる。
sudo apt install intel-media-va-driver-non-free vainfo
vainfo # 認識されたVAAPI対応デバイスを確認
H.264 QSVの基本コマンド
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の対応確認コマンドは以下。
ffmpeg -encoders | grep amf
WindowsではRadeonドライバーのインストールだけで使える。Linuxは現時点でAMFのサポートが限定的で、Mesa VAAPIドライバー経由の h264_vaapi / hevc_vaapi を代わりに使うケースが多い。
H.264 AMFの基本コマンド
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 スコア |
|---|---|---|---|---|
| x264 | slow | 28分14秒 | 2.1 GB | 94.2 |
| x265 | slow | 41分03秒 | 1.2 GB | 94.8 |
| h264_nvenc | p5 | 2分41秒 | 2.6 GB | 91.3 |
| hevc_nvenc | p5 | 2分58秒 | 1.5 GB | 91.7 |
| h264_qsv | medium | 3分22秒 | 2.8 GB | 90.1 |
| h264_amf | balanced | 3分08秒 | 2.9 GB | 89.4 |
VMAFはNetflixが開発した知覚品質スコア(0〜100、高いほど良い)。この数値は参考値で、ソース素材やGPUの世代によって大きく変わる。
自分の環境でベンチマークを取るなら、以下のコマンドが便利だ。エンコード時間はFFmpegのログ末尾に表示される speed= の値から計算できる。
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インストールガイド から始めよう。