Quantcast
Channel: FFmpeg | ニコラボ
Viewing all 310 articles
Browse latest View live

Vulkan を使ったハードウェアアクセレーションフィルタのまとめ

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。GPU を取り付けていると使える Vulkan フィルタのまとめ。現状ビルドスクリプトは対応していない。フィルタの使い方の公式ドキュメントはまだない。

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

以下のコマンドでGPUが対応しているか調べられる。
ffmpeg -hide_banner -v verbose -init_hw_device vulkan

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 libx264 -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 libx264 -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

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 libx264 -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 libx264 -c:a copy output.mp4

映像の上に映像をのせる overlay

オプション

  • x[string]
    オーバーレイする映像の左上の横座標。W, H, t, n などは使えない
  • y[string]
    オーバーレイする映像の左上の縦座標。W, H, t, n などは使えない

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 libx264 -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 libx264 -c:a copy output.mp4

平均ブラー avgblur

オプション

  • sizeX[int]
    横軸のカーネルのサイズ。大きい値ほどぼける
    既定値:3
    範囲:1 から 32 まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:15(すべてのチャンネル)
    範囲:0 から 15 まで
  • sizeY[int]
    縦軸のカーネルのサイズ
    既定値:3
    範囲:1 から 32 まで

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 libx264 -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 libx264 -c:a copy output.mp4

オプション

彩度を上下左右にずらす。

  • dist_x[float]
    プラスで右に、マイナスで左にずれる
    既定値:0
    範囲:-10 から 10 まで
  • dist_y[float]
    プラスで下に、マイナスで上にずれる
    既定値:0
    範囲:-10 から 10 まで

フィルタ内容をテキストで読み込む filter_script、filter_complex_script

$
0
0

ffmpeg が難しいと言われる理由の一つにフィルタの書き方がわからないというのがある。コマンドプロンプトだと改行できないので長くなるほど読みにくくなる。これを解決するのが -filter_script、-filter_complex_script である。

-filter_script は映像と音声別々に扱い、同じ種類の2番目以降のストリームを扱えない。-filter_complex_script-filter_complex と同じ使い方をする。-filter_script、-filter_complex_script どちらもコメントは書き込めない。

ffmpeg : フィルタの記述方法

基本コマンド

ffmpeg -i input -filter_script:v scriptv.txt output

scriptv.txt

yadif=0:-1:1,
decimate,
setpts=N/(24000/1001)/TB,
scale=1280:-2

ffmpeg でインターレース解除

ffmpeg -i input -filter_script:v scriptv.txt -filter_script:a scripta.txt output

scripta.txt

dynaudnorm

ffmpeg で聞き取りやすい音量に変える dynaudnorm

ffmpeg -i input -filter_complex_script script.txt output

script.txt

[0:v:0]yadif=0:-1:1,
decimate,
setpts=N/(24000/1001)/TB,
scale=1280:-2;
[0:a:0]dynaudnorm

公式ドキュメント:ffmpeg Documentation : Main options

ブロックマッチングアルゴリズムでデノイズするbm3d

$
0
0

nlmeansフィルタ並みに処理が遅いが、フレーム間の動きを推定してデノイズする3次元デノイザbm3dフィルタの使い方。3次元のデノイザは他に hqdn3d フィルタがある。bm3dはBlock-Matching 3Dの略語。

非局所平均のデノイザ nlmeans
Windows の ffmpeg で生放送する方法 – hqdn3d

Block-matching algorithm – Wikipedia
Block-matching and 3D filtering – Wikipedia

基本コマンド

ffmpeg -i input -vf bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic -c:a copy output

最初のチャンネル、YUVの映像なら輝度の Y だけフィルタを当てる。
ffmpeg -i input -vf bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic:planes=1 -c:a copy output

estimを使って推定モードに変える。
ffmpeg -i input -vf split[0][1];[0]bm3d=sigma=3:block=4:bstep=2:group=1:estim=basic[0a];[1][0a]bm3d=sigma=3:block=4:bstep=2:group=16:estim=final:ref=1 -c:a copy output

先に当てるフィルタをnlmeansに代える。
ffmpeg -i input -vf split[0][1];[0]nlmeans=s=3:r=7:p=3[0a];[1][0a]bm3d=sigma=3:block=4:bstep=2:group=16:estim=final:ref=1 -c:a copy output

公式ドキュメント:FFmpeg Filters Documentation : bm3d

オプション

  • sigma[float]
    デノイズ強度の指定。この値がデノイズに大きな影響があるので映像によって調整する
    既定値:1
    範囲:0から99999.9まで
  • block[int]
    2次元のローカルパッチサイズの指定
    既定値:4
    範囲:4から6まで
  • bstep[int]
    処理ブロックのスライディングステップの指定。値が小さいほどより多くの参照ブロックを処理でき処理速度は遅くなる
    既定値:4
    範囲:1から64まで
  • group[int]
    3次元の類似ブロックの最大数の指定。1にするとブロッキングマッチを行わない。値を大きくすると1つのグループ内のブロック数が多くなる
    既定値:1
    範囲:1から256まで
  • range[int]
    探索ブロックマッチングの半径の指定
    既定値:9
    範囲:1からINT_MAXまで
  • mstep[int]
    ブロックマッチングのための2区間のステップの指定。小さな値ほど遅くなる
    既定値:1
    範囲:1から64まで
  • thmse[float]
    ブロックマッチングの二乗平均誤差のしきい値の指定
    既定値:0
    範囲:0からINT_MAXまで
  • hdthr[float]
    3次元に変換されたドメインでのハードなしきい値の指定
    既定値:2.7
    範囲:0からINT_MAXまで
  • estim[int]
    フィルタの推測モード指定。ブロックマッチングで2番目の映像を参照するときはfinalになる
    • 0, basic:既定値
    • 1, final
  • ref[boolean]
    ブロックマッチングに2番目のストリームを参照する
    既定値:0
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくはffmpeg について | チャンネルの順番と注意点を参照
    既定値:7(3つのチャンネル全部)
    範囲:0から15まで

バンディング低減フィルタdeband

$
0
0

バンディングアーチファクトを低減させるdebandフィルタの使い方。バンディング部分は参照した周辺のピクセルで平均化される。

基本コマンド

ffmpeg -i input -vf deband=1thr=0.02:2thr=0.02:3thr=0.02:blur=1 -c:a copy output
ffplay -i input -vf deband=0.02:0.02:0.02:1 -c:a copy output

公式ドキュメント:FFmpeg Filters Documentation : deband

オプション

  • 1thr[float]
    第1チャンネルのバンディング検出のしきい値の指定。現在のピクセルと参照ピクセルの差がしきき値よりも小さいときバンディングしているとみなされる
    既定値:0.02
    範囲:0.00003(3e-05)から0.5まで
  • 2thr[float]
    第2チャンネルのバンディング検出のしきい値の指定。現在のピクセルと参照ピクセルの差がしきき値よりも小さいときバンディングしているとみなされる
    既定値:0.02
    範囲:0.00003(3e-05)から0.5まで
  • 3thr[float]
    第3チャンネルのバンディング検出のしきい値の指定。現在のピクセルと参照ピクセルの差がしきき値よりも小さいときバンディングしているとみなされる
    既定値:0.02
    範囲:0.00003(3e-05)から0.5まで
  • 4thr[float]
    第4チャンネルのバンディング検出のしきい値の指定。現在のピクセルと参照ピクセルの差がしきき値よりも小さいときバンディングしているとみなされる
    既定値:0.02
    範囲:0.00003(3e-05)から0.5まで
  • range, r[int]
    バンディング検出する範囲をピクセル単位で指定する。正の値では0から指定値までの範囲の乱数が使われ、負の場合では正確な絶対値が使われる
    既定値:16(4^2で周囲4ピクセルの正方形)
    範囲:INT_MINからINT_MAXまで
  • direction, d[float]
    比較する4方向のピクセルをラジアン単位で指定する。正の値では0から指定した方向までのランダムな方向が選ばれ、負の値では絶対値の正確な方向が選ばれる。例えば、0、-PI、-2*PIラジアンの方向は同じ行のピクセルのみが選ばれ、-PI/2の方向は同じ列のピクセルのみが選ばれる
    既定値:6.28319(2*PI)
    範囲:-6.28319から6.28319まで
  • blur,b[boolean]
    有効にすると現在のピクセルは周囲の4つのピクセルの平均値と比較される。無効にすると現在のピクセルは周囲の4つのピクセルすべてと比較される。周囲のピクセルと4つの差がすべてしきい値よりも小さいときはピクセルはバンディングしているとみなす
    既定値:1
    範囲:0と1
  • coupling, c[boolean]
    有効にするとすべてのピクセルコンポーネントがバンディングしているときのみ現在のピクセルを変更する
    既定値:0
    範囲:0と1

フレーム、サンプル単位で情報を得るshowinfo、ashowinfo

$
0
0

PTSやピクチャータイプやピクセルフォーマット、ピクセル値などを調べるのに使うshowinfo、ashowinfoフィルタの使い方。一般的な使い方はffplayで再生してコンソールに情報を流しながら見るもので、得た情報のメタデータを他のフィルタに渡すことは今のところできない。

基本コマンド

ffplay -i input -vf showinfo=1
ffplay -i input -af ashowinfo

オプション

checksum[boolean]
showinfoフィルタのみ。映像のチェックサム、ピクセル平均、ピクセル標準偏差を計算する。
既定値:1
範囲:0と1

解析内容

showinfo

  • n
    デコード開始からのフレーム番号。シークするとリセットされる。回避方法
  • pts
    PTS時間。よく見る時間はこれにタイムベースを掛けている
  • pts_time
    PTS時間。非表示になるときは取得できていないか、意味をなさないなど
  • pos
    デコード時点での合計ファイルサイズ
  • fmt
    ピクセルフォーマット名
  • sar
    サンプルアスペクト比。num/den
  • s
    映像の解像度。横x縦
  • i
    インターレースの状態(”P”はプログレッシブ。”T”はトップフィールドファースト。”B”はボトムフィールドファースト)
  • iskey
    キーフレームかどうか。0ならそれ以外
  • type
    ピクチャータイプ(”I”はI-frame。”P”はP-frame。”B”はB-frame。”?”は不明)
  • checksum
    Adler-32チェックサム
  • plane_checksum
    各チャンネルのAdler-32チェックサム
  • mean
    各チャンネルのピクセル平均値
  • stdev
    各チャンネルのピクセル標準偏差値

ashowinfo

  • n
    デコード開始からのフレーム番号。シークするとリセットされる。回避方法
  • pts
    PTS時間。よく見る時間はこれにサンプリング周波数を割っている
  • pts_time
    PTS時間
  • pos
    デコード時点での合計ファイルサイズ
  • fmt
    サンプルフォーマット名
  • chlayout
    チャンネルレイアウト名
  • rate
    サンプリング周波数
  • nb_samples
    オーディオ1フレームあたりのサンプル数
  • checksum
    Adler-32チェックサム
  • plane_checksums
    各チャンネルのAdler-32チェックサム

シーンチェンジの時間を調べるscdet

$
0
0

ffmpeg 4.3から使える予定のフィルタ。映像の切り替わり、シーンチェンジの時間を調べてそのフレームを出力するのに便利なscdetフィルタの使い方。似たフィルタにselectフィルタのsceneがあるがこれとは計算方法が異なる。

基本コマンド

調べた内容をコンソールとscdet.txtに出力する。
ffmpeg -i input -vf scdet,metadata=print:file=scdet.txt -an -f null -

scdet.txtの内容例。lavfiで始まるmetadataは下で解説している。

frame:0    pts:0       pts_time:0
lavfi.scd.mafd=0.000
lavfi.scd.score=0.000
frame:1    pts:2002    pts_time:0.0417083
lavfi.scd.mafd=0.026
lavfi.scd.score=0.026
:
frame:27   pts:54054   pts_time:1.12613
lavfi.scd.mafd=23.721
lavfi.scd.score=23.718
lavfi.scd.time=1.12613

調べた内容を映像に描写する。最後の行にselectフィルタも併用し、‘gte(scene,0)’でシーンチェンジが0以上、つまりすべてのフレームを出力して次のフィルタにメタデータを渡せるようにしている。
ffplay -i input -vf scdet,select='gte(scene,0)',drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"mafd "%{metadata\:lavfi.scd.mafd}',drawtext=y=40:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"score "%{metadata\:lavfi.scd.score}',drawtext=y=60:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"time "%{metadata\:lavfi.scd.time}',drawtext=y=80:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"pts-time "%{pts\:hms}',drawtext=y=100:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"scene-score "%{metadata\:lavfi.scene_score}'

描写内容をテキストで指定する。
ffplay -i input -vf scdet,select='gte(scene,0)',drawtext=y=20:fontfile=C\\://WINDOWS/Fonts/arial.ttf:fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:line_spacing=2:textfile=scdet_drawtext.txt

ffprobeで調べる。
ffprobe -v error -f lavfi -i movie=input.mp4,scdet -select_streams v:0 -show_entries packet_tags=lavfi.scd.time -of csv > output.csv
ffprobe -v error -f lavfi -i movie=input.mp4,scdet -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.scd.time -of csv > output.csv
ffprobe -v error -f lavfi -i movie=input.mp4,scdet -select_streams v:0 -show_entries packet=pts_time -show_entries packet_tags=lavfi.scd.mafd,lavfi.scd.score,lavfi.scd.time -of csv > output.csv

公式ドキュメント:FFmpeg Filters Documentation : scdet

オプション

  • threshold, t[double]
    シーンチェンジを検出するしきい値を最大変化量の%で指定する。推奨値は8から14まで。YUVの映像だとYの値が、RGBの映像だとすべてのチャンネルの係数で計算する
    既定値:10
    範囲:0から100まで
  • sc_pass, s[boolean]
    有効にするとシーンチェンジのフレームだけ出力する。シーンチェンジの画像出力で使う
    既定値:0(無効)
    範囲:0と1

sc_passの利用例

シーンチェンジを連番JPGで出力する。-anで音声無効。-vsync 0でシーンチェンジ以外のフレームを出力しない。-vframesで出力フレーム数の指定。
ffmpeg -i input -vf scdet=sc_pass=1 -an -vsync 0 -vframes 10 scenechange-%3d.jpg

連番画像のファイル名を任意の数値で指定するなら-start_numberを使う。
ffmpeg -i input -vf scdet=sc_pass=1 -an -start_number 0 -vsync 0 -vframes 10 scenechange-%3d.jpg

ffmpeg でのフレームレート設定の違い
【ffmpeg】動画から特定フレームを画像で出力する方法

メタデータキーの解説

  • lavfi.scd.mafd
    フレーム毎にmafd(Mean absolute frame difference:前後フレーム間のピクセル絶対値の平均)が指定される
  • lavfi.scd.score
    フレーム毎にシーンチェンジを検出するためのシーンチェンジスコアが指定される
  • lavfi.scd.time
    シーンチェンジを検出するためにフィルタリングされた現在のフレーム時間が指定される。シーンチェンジが検出されないと指定されない

フレーム間のメディアンフィルタtmedian

$
0
0

ffmpeg 4.3から使える予定のフィルタ。1つの映像の連続したフレームの中央値や任意の割合のピクセル値で出力するtmedianフィルタの使い方。

1フレーム内のメディアンフィルタ median
複数ファイルの映像のピクセル中央値を返す xmedian

基本コマンド

3つのチャンネルで2フレームの中央値をとる。
ffmpeg -i input -vf tmedian=radius=2:planes=7:percentile=0.5 -c:a copy output
ffmpeg -i input -vf tmedian=2:7:0.5 -c:a copy output
ffplay -i input -vf tmedian=2:7:0.5

公式ドキュメント:FFmpeg Filters Documentation : tmedian

オプション

  • radius[int]
    フィルタを当てる過去のフレーム枚数
    既定値:1
    範囲:1から127まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点を参照
  • percentile[float]
    百分位数の指定。0.5なら中央値。0なら最小値。1なら最大値
    既定値:0.5
    範囲:0から1まで

256色のパレットを出力するshowpalette

$
0
0

パレット最適するpalettegenフィルタがあるが、こちらは映像に最適化したパレットを作らないのできれいなグラデーションにならない。

ffmpeg で 256色を最適化する palettegen, paletteuse

基本コマンド

16×16にオプションの16を掛けた256×256で256色のパレットを作る。入力映像でパレットの内容は変わらない。
ffmpeg -f lavfi -i color -vf showpalette=16 -vframes 1 showpalette.png

パレットのヒストグラムを調べる。アルファチャンネルが不要ならformat=gbrpを追加する。
ffmpeg -i showpalette.png -vf histogram,format=gbrp showpalette-histogram.png

ffmpeg でヒストグラムを表示する

公式ドキュメント:FFmpeg Filters Documentation : showpalette

オプション

s[int]
パレットのサイズ指定。16×16のパレットに指定した整数倍が出力解像度になる。1を指定するとpaletteuseフィルタで使えるサイズになる。
既定値:30
範囲:1から100まで


任意の絶対値の差を返すmaskedthreshold

$
0
0

ffmpeg 4.3から使える予定のフィルタ。2入力した映像のピクセル値を比較し絶対値の差が、任意のしきい値と等しいかそれ以下ならば1入力のピクセル値が選ばれ、そうでなければ2入力のピクセル値が選ばれるmaskedthresholdフィルタの使い方。

基本コマンド

input1、input2は同じ映像とする。効果がわかりやすいように lutyuv フィルタでピクセル値を変更している。以下の例でオリジナルのYUVのピクセル値が+0、-0、+6になる。
ffmpeg -i input1 -i input2 -filter_complex [1:v]lutyuv=val+4:val-5:val+6[1v];[0:v][1v]maskedthreshold=5 -c:a copy output

コンソールで確認する例。threshold=5なので絶対値が5以下は1入力のまま、6以上は2入力が選ばれ、mean:[100 100 106]で3番目のチャンネルだけ106で+6になっている。
ffmpeg -f lavfi -i color=s=4x4:d=1,lutyuv=100:100:100 -f lavfi -i color=s=4x4:d=1,lutyuv=104:95:106 -filter_complex maskedthreshold=threshold=5,showinfo -vframes 1 -f null -

公式ドキュメント:FFmpeg Filters Documentation : maskedthreshold

オプション

  • threshold[float]
    しきい値の指定。この値と等しいかそれ以下ならば1入力のピクセル値が選ばれ、そうでなければ2入力のピクセル値が選ばれる
    既定値:1
    範囲:0から65535まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点を参照
    既定値:15(すべてのチャンネル)
    範囲:0から15まで

英語版のffmpegの使い方解説本が1日だけ無料

$
0
0

‘FFMPEG Quick Hacks’ Kindle ebook free for a few days : ffmpegより、

It seems to be free now. I checked the KDP page. The offer ends at midnight (PDT) on 4th June.

6月4日の夜までkindleで無料になっている。同時にKindle Unlimitedにも入っているので購入し忘れても加入していれば無料で読める。

さらに現在KADOKAWA電撃文庫の多くのライトノベルがKindle Unlimitedに入ってるので今加入するのもいいかもしれない。

fc2blogのときはamazonと楽天のアフィリエイトリンクを載せていたがこのブログでは一切載せていなかった。この機会にこの記事とプロフィールのところに載せた。

KADOKAWA 電撃文庫1900点以上が読み放題 あの人気作品もKindle Unlimitedなら読み放題!

具体的なタイトル抜粋(今日時点

  • ストライク・ザ・ブラッド(最新刊まで
  • 魔法科高校の劣等生(16巻まで
  • 俺を好きなのはお前だけかよ(13巻まで
  • 青春ブタ野郎(8巻まで
  • ロウきゅーぶ!(全巻
  • 天使の3P! (全巻
  • デュラララ!! (全巻
  • とらドラ!(全巻
  • バッカーノ!(全巻
  • なれる!SE(全巻

アニメ関係だと「声優グランプリ」「アニメディア 」「メガミマガジン」「Animage (アニメージュ) 」も過去数ヶ月分Kindle Unlimitedに入ってる。

RGBの座標をずらすrgbashift

$
0
0

RGBとアルファチャンネルの座標をずらすrgbashiftフィルタの使い方。フィルタ名はrgbaだが、オプションの順番はgbraになる。

基本コマンド

緑色は右下に5ずらし、青色は左上に5ずらす。
ffmpeg -i input -vf rgbashift=gh=5:gv=5:bh=-5:bv=-5 -c:a copy output
ffplay -i input -vf rgbashift=5:5:-5:-5

公式ドキュメント:FFmpeg Filters Documentation : rgbashift

オプション

ffmpeg -h filter=rgbashiftの順番はrgbaの順番だが、オプション名を省略するとgbraの順番になる。

  • gh[int]
    緑色の横座標をプラスで右に、マイナスで左にずらす
  • gv[int]
    緑色の横座標をプラスで下に、マイナスで上にずらす
  • bh[int]
    青色の横座標をプラスで右に、マイナスで左にずらす
  • bv[int]
    青色の横座標をプラスで下に、マイナスで上にずらす
  • rh[int]
    赤色の横座標をプラスで右に、マイナスで左にずらす
  • rv[int]
    赤色の横座標をプラスで下に、マイナスで上にずらす
  • ah[int]
    透過色の横座標をプラスで右に、マイナスで左にずらす
  • av[int]
    透過色の横座標をプラスで下に、マイナスで上にずらす
  • edge[int]
    ずらした余白の扱い
    • 0, smear:隣接した色で埋める。既定値
    • 1, wrap:ずらした反対側の値で埋める

彩度の座標をずらすchromashift

$
0
0

彩度の座標をずらすことで色収差のような効果が得られるchromashiftフィルタの使い方。RGBの座標をずらすならrgbashiftフィルタがある。

RGBの座標をずらすrgbashift

ハードウェア支援を使ったchromaber_vulkanフィルタもある。
Vulkan を使ったハードウェアアクセレーションフィルタのまとめ

基本コマンド

青の色差成分は右下に5ずらし、赤の色差成分は左上に5ずらす。
ffmpeg -i input -vf chromashift=cbh=5:cbv=5:crh=-5:crv=-5 -c:a copy output
ffplay -i input -vf chromashift=5:5:-5:-5

公式ドキュメント:FFmpeg Filters Documentation : chromashift

オプション

  • cbh[int]
    青の色差成分の横座標をプラスで右に、マイナスで左にずらす
  • cbv[int]
    青の色差成分の横座標をプラスで下に、マイナスで上にずらす
  • crh[int]
    赤の色差成分の横座標をプラスで右に、マイナスで左にずらす
  • crv[int]
    赤の色差成分の横座標をプラスで下に、マイナスで上にずらす
  • edge[int]
    ずらした余白の扱い
    • 0, smear:隣接した色で埋める。既定値
    • 1, wrap:ずらした反対側の値で埋める

映像を拡大するアップコンバートフィルタのまとめ

$
0
0

等倍率で解像度を大きくするアップスケーリング(アップコンバート)フィルタのまとめ。

通常のリサイズフィルタ:

hqx

Maxim Stepin氏が作った拡大フィルタ。hqxはhigh-quality magnificationの略語。出力フォーマットはbgra。

2倍に拡大。
ffmpeg -i input -vf hqx=n=2 -pix_fmt yuv420p -c:a copy output
ffplay -i input -vf hqx=2

n[int]
既定値:3
範囲:2から4まで

公式ドキュメント:FFmpeg Filters Documentation : hqx

super2xsai

フィルタ名のsaiはScale and Interpolateの略語。ピクセルアート(ドット絵)でシャープネスを損なわずに拡大するのに効果的。出力フォーマットはbgra。

2倍に拡大。オプションはなく2倍拡大のみ。
ffmpeg -i input -vf super2xsai -pix_fmt yuv420p -c:a copy output
ffplay -i input -vf super2xsai

公式ドキュメント:FFmpeg Filters Documentation : super2xsai

xbr

エッジ検出のルールに基づいて拡大する。特にピクセルアート(ドット絵)の拡大で効果的。出力フォーマットはbgr0。
論文:xBR algorithm tutorial – RetroArch Additions / Shaders – Libretro Forums

2倍に拡大。
ffmpeg -i input -vf xbr=n=2 -pix_fmt yuv420p -c:a copy output
ffplay -i input -vf xbr=2

n[int]
既定値:3
範囲:2から4まで

公式ドキュメント:FFmpeg Filters Documentation : xbr

sr

ニューラルネットワークを使って拡大する。srはsuper resolutionの略語。TensorFlowをインストールしてモデルを使う方法と、使わない方法があるがWindowsで使うのが難しく試せてないので説明省略。

公式ドキュメント:FFmpeg Filters Documentation : sr

映像を分割し連続フレームにするuntile

$
0
0

ffmpeg 4.3から使える予定のフィルタ。tileフィルタで一覧にした複数フレームを1つの連続したフレームに戻すのと、1フレームを分割して複数フレームにするuntileフィルタの使い方。

1フレームに複数のフレームを表示する tile

基本コマンド

tileフィルタで複数並べたのを元に戻す例。
ffmpeg -i input -vf tile=layout=3x3,untile=layout=3x3 -c:a copy output
ffplay -i input -vf tile=layout=3x3,untile=layout=3x3

縦に4分割した映像の例。フレームレートとフレーム数は分割しただけ増える。つまり1×4なので4倍。奇数解像度はピクセルフォーマットによってはエラーになるのに注意する。
ffmpeg -i input -vf untile=layout=1x4 -c:a copy output
ffplay -i input -vf untile=layout=1x4

縦に分割したファイルを再び縦に並べ直してシーンチェンジ効果を作る。これも分割数だけフレームが増える。
ffmpeg -i input -vf untile=1x4,select='1+mod(n,4)':n=4,vstack=4 -c:a copy output
ffplay -i input -vf untile=1x4,select='1+mod(n,4)':n=4,vstack=4

10分割位にするとシーンチェンジ効果がよく分かるがフレームがそれだけ増えるので元のフレームレートを再指定してフレームを減らす。
ffmpeg -i input -vf untile=1x10,select='1+mod(n,10)':n=10,vstack=10,fps=24/1.001 -c:a copy output
ffplay -i input -vf untile=1x10,select='1+mod(n,10)':n=10,vstack=10

4分割してxstackフィルタで元に戻す。
ffplay -f lavfi -i testsrc2 -vf "untile=2x2,select='1*eq(mod(n,4),0)+2*eq(mod(n+3,4),0)+3*eq(mod(n+2,4),0)+4*eq(mod(n+1,4),0)':n=4,xstack=4:layout=0_0|w0_0|0_h0|w0_h0"
ffplay -f lavfi -i testsrc2 -vf "untile=2x2,select='1+mod(n,4)':n=4,xstack=4:layout=0_0|w0_0|0_h0|w0_h0"

解像度が一致しなくても映像を並べられる xstack

eq(mod(N,4),0)の出力フレーム番号。1が開始フレーム。

N 出力フレーム
n 1, 5, 9
n+1 4, 8, 12
n+2 3, 7, 11
n+3 2, 6, 10

公式ドキュメント:FFmpeg Filters Documentation : untile

オプション

  • layout[image_size]
    1フレームのタイルの枚数を指定する。左上から右下に並ぶ(横x縦)
    既定値:6×5

方向ブラーdblur

$
0
0

ffmpeg 4.3 から使える予定のフィルタ。特定の方向にぼかすdblurフィルタの使い方。

基本コマンド

既定値のオプションを当てる。
ffmpeg -i input -vf avgblur=angle=45:radius=5:planes=15 -c:a copy output
ffplay -i input -vf avgblur=45:5:15

効果がわかりやすいサンプル例。
ffplay -f lavfi -i testsrc2 -vf dblur=90:10
ffplay -f lavfi -i testsrc2 -vf dblur=180:10

公式ドキュメント:FFmpeg Filters Documentation : dblur

オプション

  • angle[float]
    ぼかす方向の角度指定
    既定値:45
    範囲:0から360まで
  • radius[float]
    ぼかす半径の指定。大きい値ほど広範囲にぼかす
    既定値:5
    範囲:1から8192まで
  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点を参照
    既定値:15(すべてのチャンネル)
    範囲:0から15まで

カラールックアップテーブルを適用するlut1d、lut3d

$
0
0

カラールックアップテーブル(CLUT)を適用して色調補正するlut1d、lut3dフィルタの使い方。lut1dフィルタが1次元でlut3dフィルタが3次元になる。

外部ファイルを参照して色調補正するフィルタにcurvesフィルタがある。
トーンカーブで RGB の調整が出来る curves

CUBE形式の書き方

1次元、3次元のCUBE形式の書き方の仕様PDF:Cube LUTSpecificationVersion 1.0

共通の書き方。

  • 文字と文字の間のセパレータは半角スペース(0x20)とタブ文字(0x09、\t)が使える。ブログでは半角スペースとする
  • 改行は0x0A(\n)とし、文字コードはUTF-8とする
  • TITLE “text”:CUBEファイルのタイトルの指定。無指定も可能で未定義になる
  • DOMAIN_MIN rl gl bl:RGB(赤緑青)の下限の指定。0から1までの浮動小数点が一般的だが、わかりやすく8ビットの0から255までの整数でもよい。省略すると0 0 0になる
  • DOMAIN_MAX rh gh bh:RGB(赤緑青)の上限の指定。0から1までの浮動小数点が一般的だが、わかりやすく8ビットの0から255までの整数でもよい。省略すると1 1 1になる
  • 各テーブルの最初のサンプル点は下界に対応する
  • 各テーブルの最後のサンプル点は上界に対応する
  • 中間値は中間サンプル点に比例して対応する
  • テーブルは可能なすべての入力値に対してサンプル点を含む必要はない
  • テーブルに含まれない入力値について等間隔を置いた近くのサンプル点間で補間する
  • 3つのテーブル、RGBは同じサイズのNを持つことと並列に並んでいることを除いて互いに独立している
  • 一部のアプリケーションではNが2の整数乗のときに最適な性能を示す
  • 一部のアプリケーションではN=256をサポートするのに十分なメモリがない

1次元LUTの書き方。

  • テーブルは赤、緑、青の3つの1次元テーブルからなり、各テーブルは入力チャネルと1つの出力チャネルがある
  • LUT_1D_SIZE N:N個のテーブル行と3×N個の列のデータとしNは2以上65536以下の整数とする
  • テーブルの値は線形補間で正しい出力値を生成するように設定しなければならない
  • テーブルのデータの行は最初のサンプルポイントから最後のサンプルポイントまで昇順とする

3次元LUTの書き方。

  • テーブルは3次元とし、3つの入力チャネルと3つの出力チャネルを持つ
  • LUT_3D_SIZE N:各次元のサンプルポイント数をN個とすると、Nの3乗個の列のデータとしNは2以上256以下の整数とする
  • テーブルの値は四面体補間で正しい出力値を生成するように設定しなければならない
  • ファイルはNの3乗行のデータテーブルを含み、それぞれがサンプルポイントに対応する
  • データテーブルの行は1列目のインデックス(赤)が最も急速に変化し、3列目のインデックス(青)が最も急速に変化しないようにインデックスを昇順にしなければならない

lut1d

1次元のCLUTを適用するlut1dフィルタ。手書きするなら3次元よりも書きやすい。

わかりやすいサンプル例。ただし色の変化はない。

TITLE "lut1d 8bit sample"
LUT_1D_SIZE 4
DOMAIN_MIN 0 0 0
DOMAIN_MAX 255 255 255
0 0 0
85 85 85
190 190 190
255 255 255

基本コマンド

input.cubeを読み込んで、線形補間を行う。
ffmpeg -i input -vf lut1d=input.cube:interp=linear,format=yuv420p -c:a copy output
ffplay -i input -vf lut1d=input.cube:linear,format=yuv420p

挙動を調べるグラデーション画像。
ffmpeg -f lavfi -i color,geq='r=255-ceil(255*X/W):g=255-ceil(255*X/W):b=255-ceil(255*X/W)' -vframes 1 gradation.png
ffmpeg -i gradation.png -vf lut1d=1d.cube:linear output.png

上のサンプルからRの85のところを90にすると線形補間ならGBが85のところでRが90になり、2倍のGBが170のところでRが180になる。

TITLE "lut1d 8bit linear sample"
LUT_1D_SIZE 4
DOMAIN_MIN 0 0 0
DOMAIN_MAX 255 255 255
0 0 0
90 85 85
190 190 190
255 255 255

ちなみにhaldclutsrclut1dフィルタを当てて、haldclutフィルタで合わせても同じ結果になる。
ffmpeg -f lavfi -i haldclutsrc=level=6 -vf lut1d=1d.cube:linear -vframes 1 haldclutsrc.png
ffmpeg -i gradation.png -i haldclutsrc.png -filter_complex [0][1]haldclut output2.png

CLUTから色を置換するhaldclut
ffmpeg で使える映像のテストソース

公式ドキュメント:FFmpeg Filters Documentation : lut1d

オプション

  • file[string]
    1次元のLUTファイルの指定。CUBEとCSPが読み込める
  • interp[int]
    補間方法の指定
    • 0, nearest
    • 1, linear。既定値
    • 2, cubic
    • 3, cosine
    • 4, spline

lut3d

3次元のCLUTを適用するlut3dフィルタ。こちらは検索するとたくさんサンプルが見つかる。

サンプル配布先例。

公式ドキュメント:FFmpeg Filters Documentation : lut3d

基本コマンド

input.cubeを読み込んで、四面体補間を行う。
ffmpeg -i input -vf lut3d=input.cube:interp=tetrahedral,format=yuv420p -c:a copy output
ffplay -i input -vf lut3d=input.cube:tetrahedral,format=yuv420p

オプション

  • file[string]
    3次元のLUTファイルの指定。CUBE、3DL(AfterEffects)、DAT(DaVinci)、M3D(Pandora)とCSP(cineSpace)が読み込める
  • interp[int]
    補間方法の指定
    • 0, nearest
    • 1, trilinear
    • 2, tetrahedral。既定値

ffmpeg 4.3 リリース

$
0
0

2020年6月16日に ffmpeg 4.3 “4:3” がリリースされた。今回のリリースバージョン名は人名ではない。今回のリリースはメジャーアップデートとなり、セキュリティ対応や 4.2 以降に追加された新機能の中からマスターにしか追加されていなかったフィルタやデコーダの新機能が全て取り込まれた。

今回のリリースで気になった部分を列挙すると、

  • Intel QSV-accelerated MJPEG decoding
  • Intel QSV-accelerated VP9 decoding
  • Support for TrueHD in mp4
  • MPEG-H 3D Audio support in mp4
  • Support AMD AMF encoder on Linux (via Vulkan)
  • VDPAU VP9 hwaccel
  • QSV-accelerated VP9 encoding
  • AV1 encoding support via librav1e
  • AV1 frame merge bitstream filter
  • AV1 Annex B demuxer
  • MediaFoundation encoder wrapper
  • switch from AvxSynth to AviSynth+ on Linux
  • WebP parser
  • ZeroMQ protocol
  • AMQP 0-9-1 protocol (RabbitMQ)
  • Support for muxing pcm and pgs in m2ts
  • Expanded styling support for 3GPP Timed Text Subtitles (movtext)

そのほかにffmpeg 4.3からフィルターのヘルプを見ると[int]の指定番号とオプションの対応が表示されるようになっている。
ffmpeg -h filter=scale

QSV関係の記事。
QSV 対応の ffmpeg をつくる
QSV フィルタの詰め合わせ vpp_qsv

Windowsで使われているffmpegでのAviSynth+の利用は以下を参照。
ニコニコのコメントを表示する AviSynth プラグイン AviSynthNicoComment

今回新しく入ったフィルタ記事の一覧。

前回記事。
ffmpeg 4.2 リリース

リリースノート。
git.videolan.org Git – ffmpeg.git/blob – RELEASE_NOTES

4.2 以降に取り込まれた機能の一覧。
git.videolan.org Git – ffmpeg.git/blobdiff – Changelog

異なるダイナミックレンジにトーンマッピングするtonemap

$
0
0

HDRからSDRなどのトーンマッピングするのに使われているtonemapフィルタの使い方。高ビット深度から低ビット深度へ変換するために範囲外の値を線形化と浮動小数点にしてトーンマッピングし、出力先の変換式などに直す処理も同時に行う。ネイティブフィルタtonemapフィルタの他にOpenCLを使ったtonemap_openclフィルタもある。

tonemap

基本コマンド

最初のzscaleフィルタで線形化し、formatフィルタで32ビット浮動小数点に変換し、tonemapフィルタのclipでトーンマッピングして、zscaleフィルタで出力先にあわせてガンマカーブをbt709にして、ピクセルフォーマットをformatフィルタで指定する。
ffmpeg -i input -vf zscale=transfer=linear,format=gbrpf32le,tonemap=clip:param=1.0,zscale=transfer=bt709,format=yuv420p -c:a copy output
ffplay -i input -vf zscale=transfer=linear,format=gbrpf32le,tonemap=clip:1.0,zscale=transfer=bt709,format=yuv420p

RGB画像で出力するときはformatフィルタをgbrpにする。
ffmpeg -i input -vf zscale=transfer=linear,format=gbrpf32le,tonemap=clip:1.0,zscale=transfer=bt709,format=gbrp -vframes 1 output.png

Zライブラリを使ったリサイズフィルタ zscale

公式ドキュメント:FFmpeg Filters Documentation : tonemap

オプション

  • tonemap[int]
    トーンマッピングアルゴリズムの指定
    • 0, none:トーンマッピングせずに輝度がはみ出た分だけ脱色する
    • 1, linear:基準の色域全体をディスプレイの線形倍数に引き伸ばす
    • 2, gamma:ガンマカーブを用いる
    • 3, clip:範囲外の値をハードクリップする。範囲外の値を歪ませながら範囲内の値に対して完璧な色精度を得るために使用する
    • 4, reinhard:画像全体の明るさをシンプルな曲線で維持し、非線形コントラストを使用することで細部を平坦にし色の精度を低下させる
    • 5, hable:全体をわずかに暗くすることで暗い部分と明るい部分の両方の細部をreinhardよりもよくする。色や明るさの精度よりも細部が重要な場合に使用する
    • 6, mobius:範囲外の値をスムーズにマッピングし範囲内のマテリアルのコントラストと色を可能な限り保持する。細部よりも色の正確さが重要な場合に使用する
  • param[double]
    tonemapに対応したパラメータの指定
    • none:指定内容はない
    • linear:引き延ばす値の指定
      既定値:1.0
    • gamma:ガンマ値の指定
      既定値:1.8
    • clip
      クリッピングの前に乗算する余分な線形係数の指定
      既定値:1.0
    • reinhard:表示ピーク時の局所的なコントラスト係数の指定。既定値の0.5は入力した色域値がクリッピング時の約半分の明るさになる
      既定値:0.5
    • hable:指定内容はない
    • mobius:線形変換からメビウス変換への移行点の指定。この点以下の値はすべて1:1でマッピングされる。値が大きいほど結果はより正確になるが、その代わりに明るい細部が失われる
  • desat[double]
    明るさのレベルを超える明るい部分には脱彩度(desaturation)を適用する。パラメータが高いほど色情報が保存される。このオプションは明るい部分の色が不自然に白になるのを防ぐのに役立つ。これにより映像がより自然に感じられるようになるが範囲外の色の情報が少なくなる。既定値の2.0はやや保守的で、ほとんどの場合空や直射日光の当たる表面にのみ適用される。0.0に指定するとこのオプションは無効になる。このオプションは入力フレームが対応しているメタデータを持っているときしか使えない
    既定値:2.0
    範囲:0からDBL_MAXまで
  • peak[double]
    この値で信号/基準ピークを上書きする。メタデータに埋め込まれたピーク情報が信頼できないときや、低域から高域へのトーンマッピングを行う場合に役立つ
    既定値:0.0
    範囲:0からDBL_MAXまで

tonemap_opencl

tonemapフィルタと少しオプション内容が異なるのと、フィルタの記述方法が難しい。

基本コマンド

HDRからSDRに変換。映像の種類によっては「Failed to inject frame into filter network: Cannot allocate memory」が出てエラーになるかもしれない。
ffmpeg -init_hw_device opencl=ocl -filter_hw_device ocl -i input -vf format=p010,hwupload,tonemap_opencl=tonemap=mobius:param=0.01:desat=0:r=tv:p=bt709:t=bt709:m=bt709:format=nv12,hwdownload,format=nv12 -c:a copy output

-hwaccel dxva2を使う。
ffmpeg -hwaccel dxva2 -hwaccel_output_format dxva2_vld -init_hw_device opencl=ocl -filter_hw_device ocl -i input -vf hwdownload,format=p010,hwupload,tonemap_opencl,hwdownload,format=nv12 -c:a copy output

公式ドキュメント:FFmpeg Filters Documentation : tonemap_opencl

オプション

  • tonemap[int]
    トーンマッピングアルゴリズムの指定
    • 0, none:トーンマッピングせずに輝度がはみ出た分だけ脱色する
    • 1, linear:基準の色域全体をディスプレイの線形倍数に引き伸ばす
    • 2, gamma:ガンマカーブを用いる
    • 3, clip:範囲外の値をハードクリップする。範囲外の値を歪ませながら範囲内の値に対して完璧な色精度を得るために使用する
    • 4, reinhard:画像全体の明るさをシンプルな曲線で維持し、非線形コントラストを使用することで細部を平坦にし色の精度を低下させる
    • 5, hable:全体をわずかに暗くすることで暗い部分と明るい部分の両方の細部をreinhardよりもよくする。色や明るさの精度よりも細部が重要な場合に使用する
    • 6, mobius:範囲外の値をスムーズにマッピングし範囲内のマテリアルのコントラストと色を可能な限り保持する。細部よりも色の正確さが重要な場合に使用する
  • param[double]
    tonemapに対応したパラメータの指定
    • none:指定内容はない
    • linear:引き延ばす値の指定
      既定値:1.0
    • gamma:ガンマ値の指定
      既定値:1.8
    • clip
      クリッピングの前に乗算する余分な線形係数の指定
      既定値:1.0
    • reinhard:表示ピーク時の局所的なコントラスト係数の指定。既定値の0.5は入力した色域値がクリッピング時の約半分の明るさになる
      既定値:0.5
    • hable:指定内容はない
    • mobius:線形変換からメビウス変換への移行点の指定。この点以下の値はすべて1:1でマッピングされる。値が大きいほど結果はより正確になるが、その代わりに明るい細部が失われる
  • desat[double]
    明るさのレベルを超える明るい部分には脱彩度(desaturation)を適用する。パラメータが高いほど色情報が保存される。このオプションは明るい部分の色が不自然に白になるのを防ぐのに役立つ。これにより映像がより自然に感じられるようになるが範囲外の色の情報が少なくなる。tonemapフィルタと少しアルゴリズムが異なる。0.0に指定するとこのオプションは無効になる
    既定値:0.5
    範囲:0からDBL_MAXまで
  • threshold[double]
    シーンが変化したかどうかを検出するためにトーンマッピングアルゴリズムのパラメータをシーンごとに微調整するしきい値の指定。現在のフレーム平均輝度とこれまでの平均輝度との距離がしきい値を超えたときシーン平均輝度とピーク輝度を再計算する
    既定値:0.2
    範囲:0からDBL_MAXまで
  • peak[double]
    上書きするピーク値
    既定値:0.0
    範囲:0からDBL_MAXまで
  • format[pix_fmt]
    出力フォーマットの指定。FFmpeg – Wikipedia : Pixel formats
    • p010:Planar YUV 4:2:0、10ビット
    • nv12:Planar YUV 4:2:0、8ビット
  • range, r[int]
    出力カラーレンジの指定。既定値は入力値と同じ
    • 1, tv, limited
    • 2, pc, full
  • primaries, p[int]
    出力カラープライマリーの指定。既定値は入力値と同じ
    • 1, bt709:HDRからSDR変換ならこちら
    • 9, bt2020:HDRの相互変換ならこちら
  • transfer, t[int]
    出力トランスファーの指定。既定値は入力値と同じ
    • 1, bt709:HDRからSDR変換ならこちら
    • 14, bt2020:HDRの相互変換ならこちら
  • matrix, m[int]
    出力色空間マトリクスの指定。既定値は入力値と同じ
    • 1, bt709:HDRからSDR変換ならこちら
    • 9, bt2020:HDRの相互変換ならこちら

フレームを間引くdecimate、mpdecimate

$
0
0

一定のフレーム間隔で重複フレームを間引くdecimateフィルタと、前フレームとあまり変化のないフレームを間引くmpdecimateフィルタの使い方。

Windows の ffmpeg で生放送する方法で書いていた内容をこちらに引っ越し内容を修正した。

一定周期のフレームを間引くフィルタにshuffleframesフィルタがある。
指定フレーム毎に順番を入れ換える shuffleframes

decimate

間引くフレームは2番目の重複フレームで、PTSを修正し元のフレームレートよりも少なく出力する。

基本コマンド

日本の映像データは一般的に5フレーム毎に1フレーム間引けば重複フレームがなくなるので既定値のままでよい。
ffmpeg -i input -vf decimate=cycle=5:dupthresh=1.1:scthresh=15:blockx=32:blocky=32:ppsrc=0:chroma=1 -c:a copy output
ffplay -i input -vf decimate

公式ドキュメント:FFmpeg Filters Documentation : decimate

オプション

  • ccycle[int]
    間引く1フレームを決めるフレーム周期の指定
    既定値:5
    範囲:2から25まで
  • dupthresh[double]
    重複フレームを検出するしきい値の指定
    既定値:1.1
    範囲:0から100まで
  • scthresh[double]
    シーンチェンジの閾値の設定
    既定値:15
    範囲:0から100まで
  • blockx, blocky[int]
    計算に使うx軸とy軸のブロックサイズを指定する。値が大きいほどノイズの抑制になるが小さな動きの検出は悪くなる。2の累乗でなければならない
    既定値:32
    範囲:4から512まで
  • ppsrc[boolean]
    あらかじめデノイズなどを行った1入力目の映像から重複フレームを調べ、2入力目の映像に1入力目の重複を調べた結果を反映させる
    既定値:0(無効)
  • chroma[boolean]
    重複フレームを検出する計算に彩度を考慮する
    既定値:1(有効)

mpdecimate

重複フレームを間引き、PTSは修正せずに可変フレームレートで出力する。-vsyncか、setpts、fpsフィルタを併用しないと間引いたフレームに再び元のフレームレートに合わせてフレームを複製するので意図した挙動にならない。似た映像を間引きdecimateフィルタのように一定間隔の重複フレームを間引くには扱いにくい。

-vsyncの内容はffmpeg でのフレームレート設定の違い | 可変フレームレートの項目で説明している。

基本コマンド

固定間隔ではない重複フレームを間引いたのをそのまま再生するには重複フレームが元のフレームレートに合わせて複製されるので有用ではない。
ffmpeg -i input -vf mpdecimate=max=0:hi=768:lo=320:frac=0.33 -vsync vfr -c:a copy output

公式ドキュメント:FFmpeg Filters Documentation : mpdecimate

オプション

  • max[int]
    連続して間引くフレーム間隔の指定。正の値ならフレーム間隔の最大値。負の値なら間引く1フレームを決めるフレーム間隔の最小値。0は最初のフレームを除きすべての重複フレームを間引く。具体例は後述
    既定値:0
    範囲:INT_MINからINT_MAXまで
  • hi[int]
    間引くしきい値の指定。8×8ピクセルを1単位としてこの値の上限を間引く候補とする
    既定値:768(8x8x12)
    範囲:INT_MINからINT_MAXまで
  • lo[int]
    間引くしきい値の指定。8×8ピクセルを1単位としてこの値の下限を間引く候補とする
    既定値:320(8x8x5)
    範囲:INT_MINからINT_MAXまで
  • frac[float]
    探索する1フレーム画像の割合
    既定値:0.33
    範囲:0から1まで

maxの挙動について

黒単色24フレームレートで10秒の動画をテストに使い、それぞれmaxに値を代入する。代入する値をnとすると以下のような出力フレームになる。

0を指定すると1フレームだけ出力する。
ffmpeg -f lavfi -i color=r=24:d=10 -vf mpdecimate=max=0 -vsync vfr -c:v ffv1 color.mkv

正の値を指定する。割合は1/(n+1)でnは1以上とする。
ffmpeg -f lavfi -i color=r=24:d=10 -vf mpdecimate=max=1 -vsync vfr -c:v ffv1 color.mkv

nの値 出力フレーム数 割合
1 120 1/2
2 80 1/3
3 60 1/4
5 40 1/6
10 22 1/11

負の値を指定する。割合は-(n+1)/nでnは-2以下とする。
ffmpeg -f lavfi -i color=r=24:d=10 -vf mpdecimate=max=1 -vsync vfr -c:v ffv1 color.mkv

nの値 出力フレーム数 割合
-1 120 1/2
-2 120 1/2
-3 160 2/3
-5 192 4/5
-10 216 9/10

連続フレームの映像を任意の割合でミックスするtmix

$
0
0

連続したフレームのピクセル値を任意の割合で混ぜ合わせるtmixフィルタの使い方。

複数入力した映像を混ぜ合わせるならmixフィルタがある。
複数の映像を任意の割合でミックスする mix

基本コマンド

連続した3フレームを3で割った1フレームで出力する。
ffmpeg -i input -vf "tmix=frames=3:weights=1 1 1:scale=0" -c:a copy ouput
ffplay -i input -vf "tmix=frames=3:weights=1 1 1:scale=0"

公式ドキュメント:FFmpeg Filters Documentation : tmix

オプション

  • frames[int]
    連続したフレーム数の指定
    既定値:3
    範囲:1から128まで
  • weights[string]
    入力の比重指定。入力毎にスペースを空ける
    既定値:”1 1 1″
  • scale[float]
    各ピクセルの値とweightsの積の和に掛ける値。0だと連続するフレームの和になる
    既定値:0
    範囲:0から32767まで

scaleの扱い

0以外を指定するとマスクのようなピクセル値になるが2極値化はそのままではしないので用途が思いつかない。scale=3scale=4の例。
ffplay -i input -vf split[0v][1v];[0v]tmix=frames=3:weights="-1 2 -1":scale=3,signalstats,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[0v];[1v]tmix=frames=3:weights="-1 2 -1":scale=4,signalstats,drawtext=fontfile=C\\://WINDOWS/Fonts/arial.ttf:textfile=signalstat_drawtext.txt:fontsize=20:borderw=1:bordercolor=white[1v];[0v][1v]vstack

Viewing all 310 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>