この記事でわかること

  • NVENCハードウェアエンコードの仕組みと前提条件
  • h264_nvenc および hevc_nvenc の基本的な使い方
  • プリセット・品質オプション(-rc-cq-b:v)の選び方
  • CPUソフトウェアエンコードとの速度・品質比較
  • よくあるエラーと対処法

テスト済みバージョン: FFmpeg 6.1(NVIDIA GPU環境)
対象 OS: Windows / Linux(CUDAドライバーが必要)


NVENCとは

NVENCはNVIDIAのGPUに搭載されたハードウェアビデオエンコーダーです。CPUのソフトウェアエンコードに比べて大幅に高速で、CPUリソースをほぼ消費しません。その代わり、ソフトウェアエンコードより圧縮効率がやや劣る傾向があります。

項目NVENCハードウェアlibx264ソフトウェア
速度5〜10倍高速基準
CPU使用率低い(GPU処理)高い
圧縮効率やや劣る優秀
対応コーデックH.264, H.265, AV1(RTX40以降)H.264

前提条件

NVENCを使うには以下が必要です:

  1. NVIDIA GPU:Kepler世代(GTX 600)以降
  2. NVIDIA ドライバー:最新版を推奨(Linux: 520以上)
  3. FFmpegのNVENC対応ビルドffmpeg -encoders | grep nvenc でH264/HEVC NVENCが表示されることを確認

NVENCが有効かどうかの確認:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -encoders | grep nvenc

h264_nvencの基本コマンド

最もシンプルなNVENCエンコード:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy output_nvenc.mp4

品質パラメーター(-cq)を指定する場合(0〜51、低いほど高品質):

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -rc vbr -cq 23 -c:a aac -b:a 128k output_nvenc.mp4

hevc_nvenc(H.265)

同等の品質でH.264よりファイルサイズを削減できます:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v hevc_nvenc -rc vbr -cq 28 -c:a aac -b:a 128k output_hevc_nvenc.mp4

プリセット

NVENCのプリセットは速度と品質のバランスを制御します:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -rc vbr -cq 23 output.mp4

新しいドライバーでは -preset p1(最速)〜 -preset p7(最高品質)を使います。古いドライバーでは fastmediumslow を使います。

プリセット速度品質
p1 / fast最速低め
p4 / mediumバランス普通
p7 / slow遅い高い

GPUデコード+NVENCエンコードの組み合わせ

GPUでデコードも行うことでCPU負荷をさらに下げられます:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input.mp4 -c:v h264_nvenc -preset p4 -rc vbr -cq 23 output.mp4

-hwaccel_output_format cuda を指定することでGPUメモリ上のデコードフレームをそのままNVENCに渡せます。


ビットレート指定エンコード

特定のビットレートをターゲットにする場合:

※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -rc cbr -b:v 4M -maxrate 4M -bufsize 8M output.mp4

よくあるエラーと対処法

No NVENC capable devices found

  • NVIDIA ドライバーが古いかインストールされていない
  • nvidia-smi でGPUが認識されているか確認

NVENC: OpenEncodeSessionEx failed: out of memory (10)

  • 他のプロセスがNVENCセッションを使い切っている
  • NVIDIAはボードごとにNVENC同時セッション数の上限を設けており、その数はGPU・ドライバ・製品ラインで異なります。使用カードについてNVIDIA公式のサポートマトリクスを確認してください

Cannot load libcuda.so.1(Linux)

  • CUDAライブラリのパスが通っていない
  • ldconfig -v | grep cuda で確認、または /usr/lib/x86_64-linux-gnu/ にあるか確認

ソフトウェアエンコードとの使い分け

用途推奨
アーカイブ・高品質libx264 / libx265(ソフトウェア)
リアルタイム・ライブ配信NVENC
バッチ変換・時間優先NVENC
GPU非搭載環境ソフトウェアエンコード

速度と品質の目安(実測レンジ)

数値は環境(GPU世代・入力解像度・プリセット)で大きく変わるため、あくまで公開ベンチマークで観測される「典型的なレンジ」として捉えてください。

  • エンコード速度: RTX 3060クラスのGPUで1080p H.264を実時間の約8〜12倍(数百fps)で処理できることが多く、libx264 -preset medium(CPU)の実時間1.5〜3倍程度と比べて一桁速いケースが珍しくありません。4Kでは2〜4倍程度に落ちます。実際の数値はGPU・ドライバ・素材・プリセット・解像度で変わります。
  • 品質トレードオフ: 同じVMAFを狙うと、NVENCは libx264 より高めのビットレートが必要になりがちです。差の大きさは世代と素材に依存します。世代が新しいほど差は縮まり、Ada Lovelace(RTX 40)世代ではかなり詰まると報告されています。
  • 使いどころ: 速度が一桁違うため、配信・大量バッチ・締め切り優先の用途では実質的にNVENC一択になりがちです。逆に1回エンコードして長期保存するアーカイブ用途では、時間をかけてでもlibx265の圧縮効率が有利です。

つまずきやすいポイント

-preset slow が効かない/プリセットが反映されない

  • 症状: -preset slow を指定しても、期待した速度・品質バランスにならない。
  • 原因: 現行のFFmpegでは両系統とも有効です。旧来の fast/medium/slow は互換用エイリアスとして残っていますが、p1p7 体系の方が挙動が分かりやすく、現在の標準的な指定方法です。
  • 対処: 再現性のために新プリセットを使うのが無難です(例: -preset p7 -tune hq)。最高品質寄りなら p6p7、バランスは p4、低遅延は p1p2

B-frameを入れたのに圧縮率が改善しない

  • 症状: -bf 3 を付けても出力サイズがほとんど減らない、あるいは無視される。
  • 原因: HEVCのB-frame対応は世代依存で、Turing(RTX 20)以降で追加されました。古いGPUではHEVCのB-frameが効かないことがあります。(H.264のB-frameは幅広い世代でサポートされています。)
  • 対処: GPU世代を確認し、-b_ref_mode middle -bf 3 を併用する。古いGPUでHEVCのB-frameが効かない場合は、ビットレートで品質を確保するかH.264を使う。

同時に2本以上エンコードすると out of memory (10) で落ちる

  • 症状: バッチで複数のNVENCプロセスを並列起動すると、ボードの上限を超えたあたりで OpenEncodeSessionEx failed が出る。
  • 原因: NVIDIAはボードごとにNVENC同時セッション数の上限を設けており、その数はGPU・ドライバ・製品ライン(GeForce/プロフェッショナル)で異なります(現行のGeForceは十数本程度、プロ向けは製品により様々で無制限のものもある)。値はラインナップ全体で一律ではありません。
  • 対処: 使用するGPU・ドライバ・製品ラインについてNVIDIA公式のサポートマトリクスで同時セッション上限を確認し、それに合わせて並列数を絞る、またはドライバを最新化する。1プロセス内で複数出力する方が安定することもあります。

CPUでデコード→GPUでエンコードして思ったほど速くない

  • 症状: NVENCにしたのにCPU使用率が高く、速度が頭打ち。
  • 原因: デコードがCPU(ソフトウェア)のままで、CPU→GPUのフレーム転送がボトルネックになっている。
  • 対処: -hwaccel cuda -hwaccel_output_format cuda を入力側に付けてデコードもGPUで行い、GPUメモリ上でNVENCに渡す。これで転送コストが消え、CPU負荷も下がります。

関連リソース

CRF・ビットレート・2 パスの設定を視覚的に調整して最適な圧縮コマンドを生成できるツールです。容量削減に迷ったときに役立ちます。

VideoCompressor for FFmpeg

関連記事


一次ソース: trac.ffmpeg.org/wiki/HWAccelIntro / ffmpeg.org/ffmpeg-codecs.html


よくある質問

NVENC は libx264 と比べて画質はどう?

同じビットレートなら NVENC の方が若干劣ります。ただし最新の NVENC(Ada Lovelace 世代以降)は libx264 medium 相当まで肉薄しており、速度を考えると実用上は十分です。

NVENC が使えない

GPU が NVIDIA 製であること、ドライバが最新であること、FFmpeg ビルドに --enable-nvenc が含まれていることを確認してください。ffmpeg -encoders | grep nvenc で確認できます。

CRF と CQ どちらを使う?

NVENC では -cq を使います(-crf は libx264 用)。値の範囲は 0〜51 で、libx264 の CRF と同様に小さいほど高画質です。19〜23 が一般的です。

B-frame は使った方がいい?

はい、-b_ref_mode middle -bf 3 で B-frame を有効にすると圧縮効率が大きく改善します。なお HEVC の B-frame 対応は世代依存で(Turing 以降で追加)、古い GPU では HEVC の B-frame が効かないことがあります。

NVENC でストリーミング配信できる?

はい、低遅延ストリーミングに最適です。-tune ll または -tune ull(ultra-low-latency)と -preset p1 の組み合わせで遅延を最小化できます。