m-ab-s/media-autobuild_suiteで調べたところ、–enable-ffnvcodec –enable-cuda –enable-cuvid –enable-nvenc –enable-nvdecを基本に、–enable-libnpp –enable-nonfreeでnpp
のつくフィルタが使え、–enable-cuda-llvmの追加でcuda
がつくフィルタが使える。
目次
bilateral_cuda スムーズ
ネイティブフィルタ:エッジ保持のスムースフィルタ bilateral
公式ドキュメント:FFmpeg Filters Documentation : bilateral_cuda
オプション
- sigmaS[float]
既定値:0.1
範囲:0.1から512まで - sigmaR[float]
既定値:0.1
範囲:0.1から512まで - window_size[int]
既定値:1
範囲:1から255まで
bwdif_cuda インターレース解除
ネイティブフィルタ:インターレースを解除する bwdif
フレームを間引くならフィルタの最後にdecimate
フィルタを追加する。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "bwdif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,bwdif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "bwdif_cuda" -c:v hevc_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : bwdif_cuda
オプション
yadif_cuda
フィルタとオプション内容は同じ。
- mode[int]
モード指定 - 0, send_frame
2枚のフィールドから1枚のフレームを作る。既定値 - 1, send_field
1枚のフィールドから1枚のフレームを作る
いわゆる片フィールド補間でフレーム数が2倍になる - 2, send_frame_nospatial
0 に似ているが空間軸のチェックを行わない - 3, send_field_nospatial
1 に似ているが空間軸のチェックを行わない - parity[int]
フィールドタイプを指定する。自動で判断できなければ tff と判断する - 0, tff
トップフィールドファースト - 1, bff
ボトムフィールドファースト - -1, auto
自動指定。既定値 - deint[int]
どのフレームを処理するか - 0, all
すべて。既定値 - 1, interlaced
インターレースフラグがあるのだけ
chromakey_cuda クロマキー
ネイティブフィルタ:ffmpeg でクロマキー合成 その2
公式ドキュメント:FFmpeg Filters Documentation : chromakey_cuda
オプション
- color[color]
既定値:black - similarity[float]
既定値:0.01
範囲:0.01から1まで - blend[float]
既定値:0
範囲:0から1まで - yuv[boolean]
既定値:false
colorspace_cuda レンジ変換
色空間変換はまだ実装されていない。
ネイティブフィルタ:色空間変換するcolorspace
公式ドキュメント:FFmpeg Filters Documentation : colorspace_cuda
オプション
- range[int]
既定値:0 - 1, tv, mpeg
- 2, pc, jpeg
overlay_cuda オーバーレイ
ネイティブフィルタ:映像の上に映像をのせる overlay
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "overlay_cuda=x=100:y=200,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "overlay_cuda=x=100:y=200" -c:v hevc_nvenc -c:a copy output.mp4
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i input.mp4 -hwaccel cuda -hwaccel_output_format cuda -i rot_text.png -filter_complex "[1]hwupload_cuda[rot];[0]scale_cuda=format=yuv420p[vid];[vid][rot]overlay_cuda=x=(W-w)/2:y=(H-h)/2" -c:v h264_nvenc output.mp4
画像をオーバーレイする。
video – Ffmpeg rotate drawtext with hwaccel – Super User
公式ドキュメント:FFmpeg Filters Documentation : overlay_cuda
オプション
- x[string]
オーバーレイする映像の左上の横座標。評価式が使える - y[string]
オーバーレイする映像の左上の縦座標。評価式が使える - eof_action[int]
2入力した映像が終了したときの1入力した映像の挙動指定。framesync を参照 - eval[int]
x、yで指定した値どのように更新するか。2021年6月11日のコミット以降から使える - 0, init:最初に決めたら更新しない
- 1, frame:フレーム毎に更新。既定値
評価式
ffmpeg で使える評価式を使って複雑な計算ができる。
- main_w, W:1入力目の横の解像度
- main_h, H:1入力目の縦の解像度
- overlay_w, w:2入力目の横の解像度
- overlay_h, h:2入力目の縦の解像度
- x:xで指定した値
- y:yで指定した値
- n:1から始まるフレーム番号
- pos:映像のバイトサイズの位置。不明ならNAN
- t:0から始まるタイムスタンプ秒。1フレーム目の経過時間が最初の値になる。不明ならNAN
scale_cuda リサイズ
libnppを使わないリサイズフィルタ。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_cuda=-2:720:interp_algo=lanczos:format=nv12,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,scale_cuda=-2:720:interp_algo=lanczos:format=nv12,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_cuda=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : scale_cuda
オプション
- w[string]
出力解像度の横幅。-nが使える
既定値:”iw”(入力横幅) - h[string]
出力解像度の縦幅。-nが使える
既定値:”ih”(入力縦幅) - interp_algo[int]
アルゴリズムの指定 - 1, nearest
- 2, bilinear
- 3, bicubic
- 4, lanczos
- format[string]
出力フォーマットの指定。無指定では変換しない。YUVとRGBの相互変換には対応していない - passthrough[boolean]
Do not process frames at all if parameters match
既定値:1(有効) - param[float]
interp_algo=bicubic利用時のカーブに利用する
既定値:999999
範囲:-FLT_MAXからFLT_MAXまで - force_original_aspect_ratio[int]
アスペクト比を強制する - 0, disable:保持する。既定値
- 1, decrease:切り捨て
- 2, increase:繰り上げ
- force_divisible_by[int]
割り切れるピクセル数の倍数の指定。w、hの-nを優先する
既定値:1
範囲:1から256まで
scale_npp リサイズ
scale_cuda
フィルタよりも使えるアルゴリズムが多い。同じアルゴリズムなら速度は変わらない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=-2:720:interp_algo=lanczos:format=nv12,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,scale_npp=-2:720:interp_algo=lanczos:format=nv12,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=-2:720:interp_algo=lanczos" -c:v hevc_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : scale_npp
オプション
- w[string]
出力解像度の横幅。-nが使える
既定値:”iw”(入力横幅) - h[string]
出力解像度の縦幅。-nが使える
既定値:”ih”(入力縦幅) - format[string]
出力フォーマットの指定
既定値:”same” - interp_algo[int]
アルゴリズムの指定 - 1, nn:Nearest Neighbour
- 2, linear:Linear
- 4, cubic:Cubic
- 5, cubic2p_bspline:2-parameter Cubic (B=1, C=0)
- 6, cubic2p_catmullrom:2-parameter Cubic (B=0, C=1/2)
- 7, cubic2p_b05c03:2-parameter Cubic (B=1/2, C=3/10)
- 8, super:Supersampling
- 16, lanczos:Lanczos
- force_original_aspect_ratio[int]
アスペクト比を強制する - 0, disable:保持する。既定値
- 1, decrease:切り捨て
- 2, increase:繰り上げ
- force_divisible_by[int]
割り切れるピクセル数の倍数の指定。w、hの-nを優先する
既定値:1
範囲:1から256まで - eval[int]
w、hで指定した値どのように更新するか - 0, init:最初に決めたら更新しない
- 1, frame:フレーム毎に更新。既定値
scale2ref_npp リサイズ
scale2ref
フィルタと同じように使う。オプションはscale_npp
フィルタと同じ。1入力を2入力の解像度に揃えて2入力は出力しない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "scale2ref_npp=interp_algo=lanczos:format=nv12[0][1];[0]hwdownload,format=nv12[0];[1]nullsink" -map [0] -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input1 -hwaccel cuda -hwaccel_output_format cuda -i input2 -filter_complex "scale2ref_npp=interp_algo=lanczos:format=nv12[0][1];[1]nullsink" -map [0] -c:v hevc_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : scale2ref_npp
オプション
- border_type[int]
- 2, replicate
公式ドキュメント:FFmpeg Filters Documentation : sharpen_npp
transpose_npp 映像回転
ネイティブフィルタ:ピクセル数はそのままに映像を回転させる transpose
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=format=yuv420p,transpose_npp=cclock_flip,hwdownload,format=yuv420p" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "scale_npp=format=yuv420p,transpose_npp=cclock_flip" -c:v h264_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : transpose_npp
オプション
transpose
フィルタとオプション内容は同じ。
- dir[int]
回転方向の設定 - 0, cclock_flip
反時計回りに90度回転し上下反転。既定値 - 1, clock
時計回りに90度回転 - 2, cclock
反時計回りに90度回転 - 3, clock_flip
時計回りに90度回転し上下反転 - passthrough[int]
フィルタを当てた後の縦と横の解像度を比較して回転をそのままにするかやめるかの設定 - 0, none
なにもしない。既定値 - 1, landscape
横解像度が縦解像度以上になるとフィルタの効果を打ち消す - 2, portrait
縦解像度が横解像度以上になるとフィルタの結果そのまま返す
thumbnail_cuda サムネイル出力
一定フレーム間隔で画像出力するときに使うフィルタ。考えられる用途はライブ配信サイトで見られるサムネイルの定期更新やVODのシークサムネイルが考えられる。しかしこのフィルタは-filter_complexで複数出力すると出力しなかったりで扱いが難しい。もしかして GPU の制限かもしれない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "thumbnail_cuda=2,hwdownload,format=nv12" -vframes 1 output.jpg
ffmpeg -hwaccel cuvid -c:v h264_cuvid -hwaccel_output_format cuda -i input -vf "thumbnail_cuda=1800,hwdownload,format=nv12" -vsync 0 output-%03d.jpg
NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,thumbnail_cuda=2,hwdownload,format=nv12" -vframes 1 output.jpg
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,thumbnail_cuda=1800,hwdownload,format=nv12" -vsync 0 output-%03d.jpg
ffmpeg ではデコードできない Animated WebPに出力。setptsフィルタの分数とthumbnail_cudaフィルタの値をそろえる。
ffmpeg -hwaccel cuvid -c:v h264_cuvid -hwaccel_output_format cuda -i input -vf "setpts=(PTS-STARTPTS)/300,thumbnail_cuda=300,hwdownload,format=nv12" -vsync 0 -vframes 100 -loop 0 output.webp
映像と音声の pts を扱う setpts, asetpts
動画出力しながらサムネイルも出力。fps
フィルタの値の逆数とthumbnail_cuda
フィルタの値の積(例では10×10)から、その秒間隔で画像出力する。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -c:v libx264 -c:a copy output.mp4 -vf "fps=1/10,format=nv12,hwupload_cuda,thumbnail_cuda=10,hwdownload,format=nv12" -vsync 0 output-%03d.jpg
video – Accurately extract frames every N seconds using FFmpeg – Super User
公式ドキュメントはない。
オプション
thumbnail
フィルタと同じ。
n[int]
おおよそのフレーム間隔で出力する
既定値:100
範囲:2からINT_MAXまで
yadif_cuda インターレース解除
ネイティブフィルタ:一番メジャーなインターレース解除フィルタ yadif
フレームを間引くならフィルタの最後にdecimate
フィルタを追加する。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device cuda=cuda -hwaccel cuda -filter_hw_device cuda -i input -vf "hwupload_cuda,yadif_cuda,hwdownload,format=nv12" -c:v libx264 -c:a copy output.mp4
NVDEC、NVENCを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -i input -vf "yadif_cuda" -c:v hevc_nvenc -c:a copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : yadif_cuda
オプション
yadif
フィルタとオプション内容は同じ。
- mode[int]
モード指定 - 0, send_frame
2枚のフィールドから1枚のフレームを作る。既定値 - 1, send_field
1枚のフィールドから1枚のフレームを作る
いわゆる片フィールド補間でフレーム数が2倍になる - 2, send_frame_nospatial
0 に似ているが空間軸のチェックを行わない - 3, send_field_nospatial
1 に似ているが空間軸のチェックを行わない - parity[int]
フィールドタイプを指定する。自動で判断できなければ tff と判断する - 0, tff
トップフィールドファースト - 1, bff
ボトムフィールドファースト - -1, auto
自動指定。既定値 - deint[int]
どのフレームを処理するか - 0, all
すべて。既定値 - 1, interlaced
インターレースフラグがあるのだけ