ffmpeg 4.3から使えるフィルタ。GPUを取り付けていると使えるVulkanフィルタのまとめ。4.5から使える予定のlibglslangとlibplaceboも使ったlibplacebo
フィルタがあり、こちらは使えるオプションがかなり多い。6.1より新しいバージョンはffplayでもvulkanデコードに対応した。
vlukanのハードウェア支援を受けた汎用フィルタlibplacebo
media-autobuild_suiteは2020年6月8日に対応:ffmpeg: support libglslang and vulkan
ハードウェア支援フィルタのまとめ
CUDA を使ったハードウェアアクセレーションフィルタのまとめ
以下のコマンドでGPUが対応しているか調べられる。
ffmpeg -hide_banner -v verbose -init_hw_device vulkan
目次
avgblur_vulkan ブラー
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。ffmpeg 6.1ではplanesを書き換えると色がおかしくなるが、ffmpeg 7.0では直っている。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,avgblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,avgblur_vulkan=sizeX=3:planes=7:sizeY=7,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
平均ブラー avgblur
FFmpeg Filters Documentation : avgblur_vulkan
オプション
- sizeX[int]
横軸のカーネルのサイズ。大きい値ほどぼける
既定値:3
範囲:1から32まで - planes[int]
フィルタを当てるチャンネル指定
詳しくは ffmpeg について | チャンネルの順番と注意点を参照
既定値:15(すべてのチャンネル)
範囲:0 から 15 まで - sizeY[int]
縦軸のカーネルのサイズ
既定値:3
範囲:1から32まで
bwdif_vulkan インターレース解除
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。対応しているのはH264、HEVC、AV1だけで、MPEG2はvulkanデコードに対応していない。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,bwdif_vulkan=0:0:0,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
インターレースを解除する bwdif
FFmpeg Filters Documentation : bwdif_vulkan
オプション
bwdif_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
インターレースフラグがあるのだけ
chromaber_vulkan 色収差
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,chromaber_vulkan=dist_x=5:dist_y=5,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
彩度の座標をずらすchromashift
FFmpeg Filters Documentation : chromaber_vulkan
オプション
彩度を上下左右にずらす。
- dist_x[float]
プラスで右に、マイナスで左にずれる
既定値:0
範囲:-10から10まで - dist_y[float]
プラスで下に、マイナスで上にずれる
既定値:0
範囲:-10から10まで
gblur_vulkan ガウシアンブラー
映像をぼかすガウシアンブラー。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,gblur_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,gblur_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,gblur_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
ガウシアンブラー gblur
FFmpeg Filters Documentation : gblur_vulkan
オプション
- sigma[float]
水平シグマの指定
既定値:0.5
範囲:0.01から1024まで - sigmaV[float]
垂直シグマの指定
既定値:0
範囲:0から1024まで - planes[int]
フィルタを当てるチャンネル指定
詳しくは ffmpeg について | チャンネルの順番と注意点を参照
既定値:15(すべてのチャンネル)
範囲:0から15まで - size[int]
カーネルサイズの指定
既定値:19
範囲:1から127まで
nlmeans_vulkan デノイズ
ハードウェア支援を行うがそれでも処理は重たい。nlmeans
フィルタは輝度と彩度を別にフィルタリングできたがこちらは個別にフィルタリングできない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,nlmeans_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,nlmeans_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,nlmeans_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
非局所平均のデノイザ nlmeans
FFmpeg Filters Documentation : nlmeans_vulkan
オプション
- s[double]
全コンポーネントのノイズ除去強度
既定値:1
範囲:1から100まで - p[int]
全コンポーネントのパッチサイズ
既定値:7
範囲:0から99まで - r[int]
探索窓の半径
既定値:15
範囲:0から99まで - t[int]
並列処理
既定値:36
範囲:1から168まで - s1[double]
1番目のコンポーネントのノイズ除去強度
既定値:1
範囲:1から100まで - s2[double]
2番目のコンポーネントのノイズ除去強度
既定値:1
範囲:1から100まで - s3[double]
3番目のコンポーネントのノイズ除去強度
既定値:1
範囲:1から100まで - s4[double]
4番目のコンポーネントのノイズ除去強度
既定値:1
範囲:1から100まで - p1[int]
1番目のコンポーネントのパッチサイズ
既定値:0
範囲:0から99まで - p2[int]
2番目のコンポーネントのパッチサイズ
既定値:0
範囲:0から99まで - p3[int]
3番目のコンポーネントのパッチサイズ
既定値:0
範囲:0から99まで - p4[int]
4番目のコンポーネントのパッチサイズ
既定値:0
範囲:0から99まで
overlay_vulkan オーバーレイ
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -hwaccel cuda -hwaccel_output_format cuda -i input2.mp4 -filter_complex "[0:v]hwdownload,format=nv12,hwupload[0v];[1:v]hwdownload,format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -hwaccel cuda -hwaccel_output_format cuda -i input2.mp4 -filter_complex "[0:v]hwdownload,format=nv12,hwupload[0v];[1:v]hwdownload,format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]format=nv12,hwupload[0v];[1:v]format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input1.mp4 -i input2.mp4 -filter_complex "[0:v]format=nv12,hwupload[0v];[1:v]format=nv12,hwupload[1v];[0v][1v]overlay_vulkan=x=100:y=200,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
映像の上に映像をのせる overlay
FFmpeg Filters Documentation : overlay_vulkan
オプション
- x[string]
オーバーレイする映像の左上の横座標。W、H、t、nなどは使えない - y[string]
オーバーレイする映像の左上の縦座標。W、H、t、nなどは使えない
scale_vulkan リサイズ
iw, ihの書式が使えるので手軽に半分の解像度の指定ができる。ただし片方に-nが使えないのでアスペクト比に合わせたリサイズはできない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,scale_vulkan=1280:720,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,scale_vulkan=1280:720,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,scale_vulkan=1280:720,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,scale_vulkan=1280:720,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
リサイズする scale
Zライブラリを使ったリサイズフィルタ zscale
オプション
- w[string]
出力解像度の横幅。-nが使えない
既定値:”iw”(入力横幅) - h[string]
出力解像度の縦幅。-nが使えない
既定値:”ih”(入力縦幅) - scaler[int]
- 0, bilinear:Bilinear interpolation (fastest)。既定値
- 1, nearest:Nearest (useful for pixel art)
- format[string]
出力フォーマットの指定 - out_range[int]
- 1, limited, mpeg, tv
- 2, full, jpeg, pc
transpose_vulkan 回転
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,transpose_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,transpose_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,transpose_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
ピクセル数はそのままに映像を回転させる transpose
FFmpeg Filters Documentation : transpose_vulkan
オプション
- dir[int]
回転方向の設定 - 0, cclock_flip:反時計回りに90度回転し上下反転。既定値
- 1, clock:時計回りに90度回転
- 2, cclock:反時計回りに90度回転
- 3, clock_flip:時計回りに90度回転し上下反転
h|vflip_vulkan 反転
左右反転するhflip_vulkan
フィルタと、上下反転するvflip_vulkan
フィルタ。オプション指定はない。
NVDECを使う。
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,hflip_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -hwaccel cuda -hwaccel_output_format cuda -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "hwdownload,format=nv12,hwupload,hflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
vulkanデコードする。
ffmpeg -hwaccel vulkan -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input -vf "hwupload,vflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4
NVDECを使わない。
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,vflip_vulkan,hwdownload" -c:v h264_qsv -c:a copy output.mp4
ffmpeg -init_hw_device vulkan=vk:0 -filter_hw_device vk -i input.mp4 -vf "format=nv12,hwupload,vflip_vulkan,hwdownload,format=nv12" -c:v hevc_nvenc -c:a copy output.mp4