この記事でわかること
- 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を使うには以下が必要です:
- NVIDIA GPU:Kepler世代(GTX 600)以降
- NVIDIA ドライバー:最新版を推奨(Linux: 520以上)
- 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(最高品質)を使います。古いドライバーでは fast、medium、slow を使います。
| プリセット | 速度 | 品質 |
|---|---|---|
| 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は互換用エイリアスとして残っていますが、p1〜p7体系の方が挙動が分かりやすく、現在の標準的な指定方法です。 - 対処: 再現性のために新プリセットを使うのが無難です(例:
-preset p7 -tune hq)。最高品質寄りならp6〜p7、バランスはp4、低遅延はp1〜p2。
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 パスの設定を視覚的に調整して最適な圧縮コマンドを生成できるツールです。容量削減に迷ったときに役立ちます。
関連記事
一次ソース: 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 の組み合わせで遅延を最小化できます。