ffmpeg 2.6 から使える NVENC, NVDEC を使う方法。

FFmpeg / libav | NVIDIA Developer
NVIDIA FFmpeg Transcoding Guide | NVIDIA Developer Blog
NVIDIA VIDEO CODEC SDK | NVIDIA Developer

hardware acceleration の Wiki:HWAccelIntro – FFmpeg

関連記事
qsv 対応の ffmpeg をつくる
AMD VCE 対応の ffmpeg をつくる

追記 2019年2月14日、2019年3月18日
SDK 9.0.18 にアップデートされた。新機能はGeForce RTX 2000番台、GTX 1660 Ti/1660 に追加されたHEVC(hevc_nvenc)のBフレーム対応。H.264(h264_nvenc)ではない。H.265(HEVC)4:4:4デコード対応。

avcodec/nvenc: add b_as_ref support for HEVC – ffmpeg.git/commitdiff

追記 2019年10月20日
SDK 9.1.23.1 にアップデート。multiple reference frames に対応。

ドライバのバージョンは
Linux: 435.21 以上
Windows: 436.15 以上

準備

現在はヘッダをインストールしないと有効化されない。インストールしていれば自動でエンコードとデコードが有効化される。

  1. まずは ffmpeg の ソースコードNVidia headers をダウンロードする
  2. nv-codec-headers のフォルダに移動し make install PREFIX=/usr して、lib, include をインストールする
  3. ffmpeg の cofigure に –disable-nvenc を付けなければ自動で有効化する
  4. SDK を使ったリサイズフィルタ scale_npp、映像を回転させる transpose_npp を使うにはツールキットをインストールして include, lib64 フォルダをリンクし、–enable-cuda-nvcc –enable-libnpp –enable-nonfree をつける。詳しくは 公式, 1, 2 を参照
  5. インストールした SDK のバージョンが上がり、nv-codec-headers がそれに対応してないと使えなくなり、またはその逆も使えなくなる(未確認)

タイトルの通りに NVENC なので Nvidia のグラフィックボードを搭載していないとエンコードできない。ドライバが古いと新しい SDK のバージョンを使った ffmpeg で使えない。さらに特定の(価格帯の安い)グラフィックボードでも NVENC が使えないことがあるのでよく調べること。NVENC が使えなくてもフィルタは使えるのでハードウェアデコードしてハードウェアアクセレーションのフィルタを使い、QSV でエンコードすれば処理はとても速くなる。

公式に対応しているグラフィックボードは以下のリンクを参照。
Video Encode and Decode GPU Support Matrix | NVIDIA Developer
NVENC – Hardware-Accelerated Video Encoding | NVIDIA Developer
NVDEC – Hardware-Accelerated Video Decoding | NVIDIA Developer

オプション内容

v 9.1 より
ffmpeg -h encoder=h264_nvenc

実際にエンコードできる環境がないので設定を煮詰められないがビットレートを上げる以外で画質の直結する設定は 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

複数の GPU を取り付けていて使い分ける場合には -gpu を使う。
parameters – how to specify the GPU to be used by nvenc in ffmpeg – Stack Overflow

リストを表示するコマンド例(Windows)。
ffmpeg -f lavfi -i nullsrc -c:v h264_nvenc -gpu list -f null -

色空間を明示する場合は H.264 だと -bsf:v h264_metadata を設定する。

FFmpeg Bitstream Filters Documentation : h264_metadata
colour_primaries, transfer_characteristics, matrix_coefficientsの値。ただし colorprim, colormatrix の 9 は bt2020, bt2020nc になるが、transfer の 9 は log100 になる。x265 と同じ内容になるので公式ドキュメントを参照する。

1 : BT.709
6 : BT.601(smpte170m)

ffmpeg -i input -vcodec nvenc_h264 -pix_fmt nv12 -rc constqp -qmin 20 -qmax 26 -bsf:v h264_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1 ouput.mkv

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)オプション

v9.1 より
ffmpeg -h encoder=hevc_nvenc

色空間を明示する場合は H.265 だと -bsf:v hevc_metadata を設定する。

FFmpeg Bitstream Filters Documentation : hevc_metadata
colour_primaries, transfer_characteristics, matrix_coefficientsの値
1 : BT.709
6 : BT.601(smpte170m)

colorprim, colormatrix の 9 は bt2020, bt2020nc になるが、transfer の 9 は log100 になる。詳しくは H.265 section E.3.1 and tables E.3, E.4 and E.5 にある。わかりやすい記事は x265 の公式ドキュメントを読む。

-bsf:v hevc_metadata=colour_primaries=1:transfer_characteristics=1:matrix_coefficients=1

デコード例

入力データの前にデコーダを指定する。無指定だとソフトウェアデコードになる。
ffmpeg -hwaccel cuvid -vcodec h264_cuvid -i input -vcodec nvenc_h264 output.mp4
ffplay -vcodec h264_cuvid -i input

利用できるハードウェアデコーダの一覧

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

デコードオプションの使い方

ハードウェアデコーダのオプションを使うと、インターレース解除、クロップ、リサイズが利用できる。

ライブラリを使ったフィルタ:CUDA を使ったハードウェアアクセレーションフィルタのまとめ

  • -deint[int]
    インターレースの解除方法
    • 0, weave:何もしない。既定値
    • 1, bob
    • 2, adaptive:通常はこちらを使う
  • -gpu[string]
    デコードに使うGPUを指定する。複数GPUを挿している場合に指定する
    例:”cuda”
  • -surfaces[int]
    Maximum surfaces to be used for decoding
    既定値:25
    範囲:0 から INT_MAX まで
  • -drop_second_field[boolean]
    インターレース解除したときに2番目のフィールドを間引く。-deint adaptive したときに併用する
    既定値:0
  • -crop[string]
    クロップ(映像を切り取るピクセル数)。0x0x0x0 だと何もクロップしない
    上x下x左x右
  • -resize[string]
    リサイズ
    横幅x縦幅

コマンド例

MPEG2の動画をハードウェアデコードしてインターレースを解除し、不要フィールドを間引き、720pにリサイズし、映像は hevc_nvenc でエンコード、音声はコピーした output.mp4 に出力。
ffmpeg -hwaccel cuvid -c:v mpeg2_cuvid -deint adaptive -drop_second_field 1 -resize 1280x720 -analyzeduration 30M -probesize 30M -i input.ts -c:v hevc_nvenc -c:a copy output.mp4

更新履歴

追記 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年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

品質指定するエンコード例を追加した。2017年10月4日
対応グラフィックボードのリンクに変更した。不要な追記文章を削除した。2017年11月29日
自動で有効化しなくなったのを追記。2018年3月4日
色空間について。2018年8月24日
SDK 9.0.18 にアップデート。2019年2月16日
SDK 9.1 にアップデート。2019年10月20日
デコードオプションの使い方。2019年10月21日

コメントを残す

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

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