この記事でわかること

  • 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セッションを使い切っている
  • Consumer GPU(GeForce)はNVENCの同時セッション数に制限がある場合がある(Quadro/RTXは制限なし)

Cannot load libcuda.so.1(Linux)

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

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

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

関連リソース

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 を有効にすると圧縮効率が大きく改善します。古い NVENC(Pascal 以前)では B-frame 機能が制限されていることがあります。

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

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