ffmpeg に nvenc(cuda) をインストールする


ffmpeg 2.6 から使える nvenc をコンパイルする方法。別途ヘッダファイルが必要なので nvidia の公式サイトから最新の SDK をダウンロードして nvEncodeAPI.h を include ディレクトリにコピーしておく。ffmpeg 3.2 から nvEncodeAPI.h を include ディレクトリにコピーする必要がなくなった。

FFmpeg / libav | NVIDIA Developer
NVIDIA VIDEO CODEC SDK | NVIDIA Developer

hardware acceleration の Wiki:HWAccelIntro – FFmpeg
qsv 対応の ffmpeg をつくる

追記 2017年5月10日
SDK 8.0.14 にアップデートされた。新機能は

  • 10/12-bit decoding support with HEVC/VP9, enabling end-to-end HDR transcoding
  • Improved quality via weighted prediction
  • Support for OpenGL inputs (Linux only)

ドライバーのバージョンは
NVIDIA Linux display driver 378.13 以上
NVIDIA Windows display driver 378.66 以上

compat/nvenc: bump nvEncodeAPI.h to Video Codec SDK 8.0.14 – ffmpeg.git/commitdiff
avcodec/nvenc: add weighted prediction support – ffmpeg.git/commitdiff
avcodec/nvenc: add fractional CQ support – ffmpeg.git/commitdiff

手順

現在は ffmpeg のソースコードをダウンロードして、ffmpeg の cofigure に --enable-nvenc をつければよい。

  1. まずは ffmpeg のソースコードを 公式サイト からダウンロードする。
  2. NVIDIA VIDEO CODEC SDK より Agree and Download SDK for Windows and Linux をダウンロードする。
  3. Windows OS の人は 【AAC+】 HE-AAC が使える ffmpeg をつくる方法 を参考に msysgitMSYS_MinGW-w64_GCC_xxx_x86-x64_Full を上書きした物を使う。
  4. SDK から Samples\common\inc\nvEncodeAPI.h を見つける。
  5. 32bit ffmpeg にインストールする場合は MSYS\mingw\i686-w64-mingw32\include に、64bit ffmpeg にインストールする場合は MSYS\mingwx86_64-w64-mingw32\include に nvEncodeAPI.h をコピーする。
  6. ffmpeg の cofigure に --enable-nvenc --enable-nonfree を付け make して完成(nonfree なので配布不可)
  7. SDK を使ったリサイズフィルタ scale_npp を使うにはツールキットをインストールして npp.h がある include フォルダをコピーしてリンクし、--enable-libnpp --enable-nonfree をつける。詳しくは12 を参照
  8. SDK を使ったリサイズフィルタ scale_cuda も利用できる。cuda.h をリンクし --enable-cuda-sdk --enable-nonfree をつける。コンパイルに cl.exe とツールキットの bin フォルダにある nvcc.exe が必要(未確認)

タイトルの通りに nvenc なので Nvidia のグラフィックボードを搭載していないとエンコードできない。nvenc が使えるかどうかは OBS を起動して 設定 < エンコード で Nvidea NVENC が選択できるかどうかで調べることもできる。ドライバーが古いと新しいSDK のバージョンを使った ffmpeg で使えない。

公式に対応しているのは次の通り。

オプション内容

v 8.0 より
ffmpeg -h encoder=h264_nvenc

Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
  -preset                    E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... 
     losslesshp                   E..V.... 
  -profile                   E..V.... Set the encoding profile (from 0 to 3) (default main)
     baseline                     E..V.... 
     main                         E..V.... 
     high                         E..V.... 
     high444p                     E..V.... 
  -level                     E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     1b                           E..V.... 
     1.0b                         E..V.... 
     1.1                          E..V.... 
     1.2                          E..V.... 
     1.3                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     2.2                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     3.2                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     4.2                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
  -rc                        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -b_adapt               E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
  -spatial-aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal-aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

実際にエンコードできる環境がないので設定を煮詰められないがビットレートを上げる以外で画質の直結する設定は preset が大きい。

H.264 オプション日本語訳

  • preset
    • hq, medium, default
      high quality の略:既定値
    • hp, fast
      high performance の略
    • bd
      ブルーレイディスク用のエンコード
    • ll
      LOW_LATENCY_DEFAULT(低遅延)
    • llhp
      LOW_LATENCY_HP(低遅延で高性能)
    • llhq
      LOW_LATENCY_HQ(低遅延で高画質)
    • slow
      hq 2pass
    • lossless
      可逆圧縮
    • losslesshp
      可逆圧縮の高圧縮モード
  • profile
    プロファイル指定。high, main, baseline or high444p。既定値:main
  • levlel
    レベル指定。auto, 1.0 … 5.1 まで。既定値:auto
  • cbr
    固定ビットレートモード。既定値:0
  • 2pass
    2パス CBR モード。既定値:auto
  • gpu
    グラフィックボードを2枚差し以上にしている場合にどれを使うか指定する。
    0 は既定値、1 は2枚目、以下同様。
  • delay
    指定フレームだけ出力結果を遅らせる。0 から。既定値:0

エンコード例

ffmpeg -i input -vcodec nvenc_h264 ouput.mkv
画面下半分の色がおかしくなる場合は -pix_fmt nv12 をつける
ffmpeg -i input -vcodec nvenc_h264 -pix_fmt nv12 ouput.mkv
実際にエンコードする場合は、rc, qmin, qmax を併用して品質指定をする
ffmpeg -i input -vcodec nvenc_h264 -pix_fmt nv12 -rc constqp -qmin 20 -qmax 26 ouput.mkv
ハードウェアデコード例。入力データの前にデコーダを指定する。無指定だとソフトウェアデコードになる
ffmpeg -vcodec h264_cuvid -i input
そのほかのハードウェアデコーダ

  • hevc_cuvid
  • mjpeg_cuvid
  • mpeg1_cuvid
  • mpeg2_cuvid
  • mpeg4_cuvid
  • vc1_cuvid
  • vp8_cuvid
  • vp9_cuvid

nvenc が使えるようになった commitdiff
avcodec: Add NVENC encoder : git.videolan.org Git
H.264 だけではなく H.265(HEVC) にも対応した commitdiff
avcodec/nvenc: Add support for H.265 encoding : git.videolan.org Git

H.265(HEVC) オプション

ffmpeg -h encoder=hevc_nvenc

Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
    General capabilities: delay 
    Threading capabilities: none
    Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
  -preset                    E..V.... Set the encoding preset (from 0 to 11) (default medium)
     default                      E..V.... 
     slow                         E..V.... hq 2 passes
     medium                       E..V.... hq 1 pass
     fast                         E..V.... hp 1 pass
     hp                           E..V.... 
     hq                           E..V.... 
     bd                           E..V.... 
     ll                           E..V.... low latency
     llhq                         E..V.... low latency hq
     llhp                         E..V.... low latency hp
     lossless                     E..V.... lossless
     losslesshp                   E..V.... lossless hp
  -profile                   E..V.... Set the encoding profile (from 0 to 4) (default main)
     main                         E..V.... 
     main10                       E..V.... 
     rext                         E..V.... 
  -level                     E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
     auto                         E..V.... 
     1                            E..V.... 
     1.0                          E..V.... 
     2                            E..V.... 
     2.0                          E..V.... 
     2.1                          E..V.... 
     3                            E..V.... 
     3.0                          E..V.... 
     3.1                          E..V.... 
     4                            E..V.... 
     4.0                          E..V.... 
     4.1                          E..V.... 
     5                            E..V.... 
     5.0                          E..V.... 
     5.1                          E..V.... 
     5.2                          E..V.... 
     6                            E..V.... 
     6.0                          E..V.... 
     6.1                          E..V.... 
     6.2                          E..V.... 
  -tier                      E..V.... Set the encoding tier (from 0 to 1) (default main)
     main                         E..V.... 
     high                         E..V.... 
  -rc                        E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
     constqp                      E..V.... Constant QP mode
     vbr                          E..V.... Variable bitrate mode
     cbr                          E..V.... Constant bitrate mode
     vbr_minqp                    E..V.... Variable bitrate mode with MinQP (deprecated)
     ll_2pass_quality              E..V.... Multi-pass optimized for image quality (deprecated)
     ll_2pass_size                E..V.... Multi-pass optimized for constant frame size (deprecated)
     vbr_2pass                    E..V.... Multi-pass variable bitrate mode (deprecated)
     cbr_ld_hq                    E..V.... Constant bitrate low delay high quality mode
     cbr_hq                       E..V.... Constant bitrate high quality mode
     vbr_hq                       E..V.... Variable bitrate high quality mode
  -rc-lookahead              E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
  -surfaces                  E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
  -cbr                   E..V.... Use cbr encoding mode (default false)
  -2pass                 E..V.... Use 2pass encoding mode (default auto)
  -gpu                       E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
     any                          E..V.... Pick the first device available
     list                         E..V.... List the available devices
  -delay                     E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
  -no-scenecut           E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
  -forced-idr            E..V.... If forcing keyframes, force them as IDR frames. (default false)
  -spatial_aq            E..V.... set to 1 to enable Spatial AQ (default false)
  -temporal_aq           E..V.... set to 1 to enable Temporal AQ (default false)
  -zerolatency           E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
  -nonref_p              E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
  -strict_gop            E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
  -aq-strength               E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
  -cq                      E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
  -aud                   E..V.... Use access unit delimiters (default false)
  -bluray-compat         E..V.... Bluray compatibility workarounds (default false)
  -init_qpP                  E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
  -init_qpB                  E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
  -init_qpI                  E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
  -qp                        E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
  -weighted_pred             E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)

更新履歴

OBS 非公式のヘッダファイルから Nvidia 公式のヘッダファイルを使うように変更した。(2015年1月8日23時頃)
SDK 6.01 に対応した。(2016年1月8日)
nonfree を消して lossless, losslesshp を追加した。(2016年4月28日)
オプションを書き直した。(2016年7月3日)
-pix_fmt nv12 を足した。(2016年7月7日)
v7 対応に修正した(2016年8月29日)
bgr0 rgb0 入力に対応(2016年9月9日)
nvenc_h264 から h264_nvenc へ、nvenc_hevc から hevc_nvenc へエンコーダー名を変更し、オプションを刷新した(2016年10月30日)
オプション例の刷新した(2016年12月26日)
v8 に対応した(2017年5月10日)
scale_npp, scale_npp の記述を追加した(2017年5月16日)

追記 2015年1月11日
5.x バージョン対応のパッチが Master of the Dark Arts-ニコニコミュニティ のオーナーの Sada_Maru氏 により配布された。ダウンロードは掲示板の 298 より。5.x バージョンは SDK の容量が小さくダウンロードが手軽である。現在はパッチ適用は不要。

追記 2015年3月25日
master では 4.x バージョン以下ではビルドできなくなり、5.x バージョン以上必須になったので記事を直した。
avcodec/nvenc: Drop support for old nvenc api : git.videolan.org Git

追記 2016年3月5日
master では 5.x バージョン以下ではビルドできなくなり、6.x バージョン以上必須になった。
configure: NVENC API version 6 is now required : git.videolan.org Git

追記 2016年4月28日
master で --enable-nonfree が不要になり配布バイナリに含められるようになった。
configure: Don’t require nonfree for nvenc : git.videolan.org Git – ffmpeg.git/commitdiff

追記 2016年8月29日
master で API 7.x に対応し、ffmpeg に組み込まれたので nvEncodeAPI.h のコピーが不要になった。ffmpeg で NVENC を使うのに SDK をダウンロードする必要がなくなったが、SDK をダウンロードするにはアカウント作成が必要になった。API 7.x で rc-lookahead のオプションと、Pascal generation GPU(GTX 1060、GTX 1070、GTX 1080)から HEVC 10-bit エンコードが追加された。それ以外の新機能が ffmpeg に実装されているかは未確認。API 7.x の新機能は以下の通り。

  • HEVC 8K (8192 pixels x 8192 pixels) encoding *
  • HEVC 4:4:4 encoding *
  • HEVC 10-bit encoding *
  • HEVC lossless encoding *
  • HEVC Sample Adaptive Offset (SAO) *
  • HEVC Motion-Estimation-(ME)-only mode *
  • HEVC (up to 8K) decoding *
  • VP9 (up to 8K) decoding *
  • HEVC long term reference (LTR) frame support
  • Asynchronous H.264 Motion-Estimation-(ME)-only mode
  • Look-ahead
  • Improved H.264 spatial adaptive quantization
  • H.264 temporal adaptive quantization
  • Rate control and quality improvements

* は Pascal generation GPU(GTX 1060、GTX 1070、GTX 1080)からの新機能になる

avcodec/nvenc: include nvEncodeAPI v7 SDK header : git.videolan.org Git
avcodec/nvenc: added support for 10 bit HEVC encoding : git.videolan.org Git
avcodec/nvenc: added support for rate control lookahead : git.videolan.org Git

追記 2017年10月4日
品質指定するエンコード例を追加した。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)