対象 OS: Windows / Linux(CUDAドライバーが必要)
NVENCとは
NVENCは、NVIDIAのGPUに入っている動画エンコード専用の回路です。CPUでエンコードするより大幅に速く、CPUはほとんど使いません。そのかわり、CPUでのエンコードより圧縮効率がやや劣りがちです。
| 項目 | NVENCハードウェア | libx264ソフトウェア |
|---|---|---|
| 速度 | 約5倍高速(1080pの実測。後述) | 基準 |
| CPU使用率 | 低い(GPU処理) | 高い |
| 圧縮効率 | やや劣る | 優秀 |
| 対応コーデック | H.264, H.265, AV1(RTX40以降) | H.264 |
前提条件
NVENCを使うには、次のものが必要です。
- NVIDIA GPU:NVENCを積んだ Maxwell 世代(GeForce GTX 750・900シリーズなど)以降のGPU。対応する機種とコーデックは、NVIDIA公式のサポートマトリクスで確認できます
- NVIDIA ドライバー:必要なバージョンはFFmpegのビルドによって違います(gyan.dev の FFmpeg 8.1 は 570.0 以上)
- NVENCに対応したFFmpeg:
ffmpeg -encoders | grep nvenc(Windowsのコマンドプロンプトではgrepの代わりにfindstr nvenc)で h264_nvenc と hevc_nvenc が表示されること
3.の一覧に出ても、GPUとドライバーで実際に使えるとは限りません。使えるかどうかは、1秒だけのテスト映像をエンコードして確かめます。エラーが出ずに終われば使えます。
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -f lavfi -i testsrc2=duration=1 -c:v h264_nvenc -f null -
h264_nvencの基本コマンド
いちばん簡単な使い方です。映像を h264_nvenc でエンコードし、音声はそのままコピーします。
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -c:a copy output_nvenc.mp4
画質を数値で決めるときは -cq を使います。値は1〜51で、小さいほど高画質です(0は自動)。
※ このコマンドは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.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
プリセット
-preset で、速さと画質のどちらを優先するかを選びます。
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -rc vbr -cq 23 output.mp4
p1(最速)〜p7(最高画質)の7段階です。fast・medium・slow も使えますが、それぞれ p1・p4・p7 の別名で、slow だけは2パスのエンコードになります。
| プリセット | 速度 | 品質 |
|---|---|---|
| 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に渡せます。
ビットレート指定エンコード
ビットレートを指定してエンコードする例です。-rc cbr は、ビットレートを一定に保つモードです。
※ このコマンドはNVIDIA GPU環境が必要です
ffmpeg -i input.mp4 -c:v h264_nvenc -rc cbr -b:v 4M -maxrate 4M -bufsize 8M output.mp4
よくあるエラーと対処法
No capable devices found
FFmpegが、NVENCを使えるNVIDIAのGPUを見つけられません(No CUDA capable devices found と出ることもあります)。nvidia-smi を実行して、GPUが認識されているか確認します。ドライバーが古いときは、代わりに The minimum required Nvidia driver for nvenc is 570.0 or newer のように、必要なバージョンが表示されます。
OpenEncodeSessionEx failed: out of memory (10)
ほかのプロセスがNVENCのセッションを使い切っています。GeForceでは、同時に使えるセッションの数に、パソコン全体で1つの上限があります(GeForceを何枚挿していても合計で数えます)。上限はドライバーや製品ラインで違うので、使っているカードの値をNVIDIA公式のサポートマトリクスで確認してください。
Cannot load libcuda.so.1(Linux)
CUDAのライブラリが見つかっていません。ldconfig -v | grep cuda で探すか、/usr/lib/x86_64-linux-gnu/ にあるかを確認します。
ソフトウェアエンコードとの使い分け
| 用途 | 推奨 |
|---|---|
| アーカイブ・高品質 | libx264 / libx265(ソフトウェア) |
| リアルタイム・ライブ配信 | NVENC |
| バッチ変換・時間優先 | NVENC |
| GPU非搭載環境 | ソフトウェアエンコード |
速度と品質の目安
速さは、GPUの世代・入力の解像度・プリセットで大きく変わります。
- エンコード速度:1080pの素材で、上の
h264_nvencの基本コマンドと-cq 23の例は約260〜270fps(実時間の約9倍)、CPUのlibx264 -preset medium -crf 23は54fps(約1.8倍)で、NVENCが約5倍速くなりました(計測条件:RTX 4090、Core i9-14900KF、FFmpeg 8.1、Big Buck Bunny〈© Blender Foundation, CC BY 3.0〉の1080p・30fps・120秒、各3回の中央値)。 - 画質:同じVMAF(画質を数値で表す指標)にそろえると、NVENCは
libx264よりビットレートが多めに必要になりがちです。差の大きさはGPUの世代と素材で変わり、新しい世代ほど小さくなります。Ada Lovelace(RTX 40)世代では、かなり縮まったと報告されています。 - 使いどころ:速度が数倍違うので、配信、大量のバッチ処理、締め切りを優先する作業では、NVENCを選ぶことがほとんどです。1回エンコードして長く保存するアーカイブなら、時間がかかっても
libx265のほうが圧縮効率で有利です。
つまずきやすいポイント
-preset slow が効かない/プリセットが反映されない
- 症状:
-preset slowを指定しても、思ったような速さと画質のバランスにならない。 - 原因:
fast・medium・slowは、それぞれp1・p4・p7の別名で、指定そのものは効いています。ただしslowは2パスのエンコード(-multipass fullres)も有効になるので、p7よりさらに遅くなります。 - 対処: 結果をそろえたいなら
p1〜p7を使います(例:-preset p7 -tune hq)。画質優先ならp6〜p7、バランスならp4、低遅延ならp1〜p2です。
B-frameを入れたのに圧縮率が改善しない
- 症状:
-bf 3を付けても出力がほとんど小さくならない。または設定が無視される。 - 原因: B-frame(前後のフレームを参照して圧縮するフレーム)に、NVENCのHEVCが対応したのは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が出る。 - 原因: 同時セッション数の上限に当たっています。GeForceの上限は今はパソコン全体で12本で、挿してあるGeForce全部の合計で数えます。2枚目のGeForceを挿しても増えません。NVIDIAが「Unrestricted」としているプロ向けのカードには決まった本数がなく、エンコーダーの処理能力やメモリーで上限が決まります。
- 対処: 使っているGPUの上限をNVIDIA公式のサポートマトリクスで確かめ、同時に動かす数をそれ以下にします。ドライバーを最新にする方法もあります。1プロセスから複数のファイルを出力するほうが安定することもあります。
CPUでデコード→GPUでエンコードして思ったほど速くない
- 症状: NVENCにしたのにCPU使用率が高く、速度が伸びない。
- 原因: デコードがCPUのままで、CPUでのデコードと、CPUからGPUへのフレームの転送が足を引っ張っている。
- 対処:
-hwaccel cuda -hwaccel_output_format cudaを-iの前に付けて、デコードもGPUで行います。フレームはGPUのメモリに置いたままNVENCに渡ります。ただしこれだけでは、デコード用のスレッドがCPUを使い続けることがあります。上の計測条件では、-threads 1も-iの前に付けると、約270fps・CPU時間約56秒が、約460fps・約2秒になりました。
関連記事
よくある質問
NVENC は libx264 と比べて画質はどう?
同じビットレートなら、NVENC のほうが少し劣ります。ただ、新しい NVENC(Ada Lovelace 世代以降)は libx264 の medium に近い画質まで来ています。速さを考えれば、実用には十分です。
NVENC が使えない
GPU が NVIDIA 製か、ドライバーが最新か、FFmpeg が --enable-nvenc 付きでビルドされているかを確認します。ビルドは ffmpeg -encoders | grep nvenc で確かめられます。
CRF と CQ どちらを使う?
NVENC では -cq を使います(-crf は libx264 用です)。値は 1〜51(0 は自動)で、libx264 の CRF と同じく、小さいほど高画質です。よく使われるのは 19〜23 です。
B-frame は使った方がいい?
はい。-b_ref_mode middle -bf 3 で B-frame を有効にすると、圧縮効率が大きく上がります。ただし HEVC の B-frame は Turing 世代から使えるようになったもので、古い GPU では効かないことがあります。
NVENC でストリーミング配信できる?
できます。遅延の小さい配信に向いています。-tune ll か -tune ull(ultra-low-latency)に -preset p1 を組み合わせると、遅延をいちばん小さくできます。