対象 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を使うには、次のものが必要です。

  1. NVIDIA GPU:NVENCを積んだ Maxwell 世代(GeForce GTX 750・900シリーズなど)以降のGPU。対応する機種とコーデックは、NVIDIA公式のサポートマトリクスで確認できます
  2. NVIDIA ドライバー:必要なバージョンはFFmpegのビルドによって違います(gyan.dev の FFmpeg 8.1 は 570.0 以上)
  3. 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 を組み合わせると、遅延をいちばん小さくできます。