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

時間でフィルタに強弱をつける

$
0
0

アルファチャンネルの濃さを調整することで時間で強弱をつけるフィルタができあがる。

基本コマンド

3秒から4秒に掛けて gblur フィルタを当てる
ffplay -i input -vf split[0],gblur=4:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay=enable='between(t,3,4)'

解説

  • split
    フィルタを当てる動画と当てない動画の2つを用意する
  • gblur=4:enable='between(t,3,4)'
    経過時間で強弱をつけるフィルタを指定し、タイムライン編集で効果のある時間だけを設定する。これを設定しないと効果が現れてない時間帯にもフィルタが働き負荷が余分にかかるのを避けるため
  • format=yuva420p
    動画にアルファチャンネルがなければアルファチャンネルを追加する
  • fade=t=in:st=3:d=0.5:alpha=1
    フィルタの効果が始まる時間の指定。3秒から始まり0.5秒(3.5秒まで)で最大になる。効果はアルファチャンネルで適用
  • fade=t=out:st=3.5:d=0.5:alpha=1
    フィルタの効果が終わる時間の指定。3.5秒から始まり0.5秒(4秒まで)で無効になる。効果はアルファチャンネルで適用
  • overlay=enable='between(t,3,4)'
    アルファチャンネル付きの動画が上に来るように読み込み、時間差で強弱をつけるフィルタと同じ時間で有効になるようにタイムライン編集で指定する。フィルタが無効になると下の動画、つまり1入力になる [0] がそのまま表示される

アルファチャンネルの効果を調べるコマンド。黒の映像は透明になり、白に近づくほど透過しなくなる
ffplay input -vf format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,alphaextract

コマンド例

コントラストを上げて暗いところがより暗くなる
ffplay -i input -vf split[0],eq=1.3:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay=enable='between(t,3,4)'
画面全体が明るくなる
ffplay -i input -vf split[0],eq=brightness=.1:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay=enable='between(t,3,4)'
画面全体が暗くなる
ffplay -i input -vf split[0],eq=brightness=-.1:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay=enable='between(t,3,4)'
画面全体にノイズが当たる
ffplay -i input -vf split[0],noise=alls=100:allf=t+u:enable='between(t,3,4)',format=yuva420p,fade=t=in:st=3:d=0.5:alpha=1,fade=t=out:st=3.5:d=0.5:alpha=1,[0]overlay=enable='between(t,3,4)'

紹介した内容
ffmpeg で使える計算書式
Windows の ffmpeg で生放送する方法 : オーバーレイ
Windows の ffmpeg で生放送する方法 : eq(明暗調整)
フェードイン、フェードアウトの設定ができる fade
FFmpeg Filters Documentation : noise

表示例

3秒から4秒の間に暗くなり明るくなる

普通にタイムライン編集した場合

タイムライン編集でフィルタの強度を変えた場合


モノクロで点滅する効果を作る

$
0
0

YUV の映像なら彩度を 0 にするか、UV を 128 にする方法で、RGB の映像なら RGB 各値をそれぞれ一定倍率を掛け合わせる方法をとり、点滅するフレーム間隔を指定するのにタイムライン編集を行う。

特定の区間だけフィルタを当てるタイムライン編集について

YUV の映像

lut, hue フィルタを使った2つの方法がある。
ffplay -f lavfi -i testsrc2,lut=val:128:128:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,3,4)+ld(0)*between(t,6,7)'
ffplay -f lavfi -i testsrc2,hue=s=0:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,3,4)+ld(0)*between(t,6,7)'

利用したフィルタ
Windows の ffmpeg で生放送する方法 : LUT(ルックアップテーブル)
色相を動的に変更できる hue

タイムライン編集の解説

  • st(0,expr) , ld(0)
    st(0,expr) で計算した結果を ld(0) で返している。計算の種類が増える場合は st(1,expr), ld(1) と値を変えれば値に対応した計算を行う
  • between((mod(n,4)),0,1)
    n は 1 から始まるフレーム番号。4フレーム毎の余りを計算し、結果が 0 と 1 の時に 1 (有効)を返し、2 と 3 の時に 0(無効)を返す
    余りの値は12301230123…
    between() を使って10011001100… となる
  • ld(0)*between(t,3,4)+ld(0)*between(t,6,7)
    t は 1フレーム目の経過時間から始まるタイムスタンプ秒。3秒から4秒の間と6秒から7秒の間で lut, hue フィルタを有効にする。時間間隔ではなくフレーム間角で有効にするには t の代わりに n を使う

RGB の映像

ffplay -f lavfi -i testsrc,colorchannelmixer=.3:.59:.11:0:.3:.59:.11:0:.3:.59:.11:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,3,4)+ld(0)*between(t,6,7)'
利用したフィルタ
RGBA の各値を別のチャンネルに混ぜ合わせる colorchannelmixer の使い方

点滅するフレーム間隔を変える

  • 1フレーム毎に点滅し、最初は元映像のまま
    mod(n,2)
  • 1フレーム毎に点滅し、最初はモノクロになる
    eq((mod(n,2)),0)
  • 3フレームの間に2フレームモノクロになり、1フレーム元映像のまま
    between((mod(n-1,3)),0,1)

数式で線や円、模様が描ける geq

$
0
0

ffmpeg のフィルタの中でおそらく最も使い方が難解な geq(generic equation) フィルタの使い方。YUV と RGB、A のそれぞれを設定により色を変えたり、回転・反転させたり、グラデーションや線、円や矩形も描ける。さらにマスクも作れるのでトランジションへの応用もできるが処理速度はかなり遅い。その書き方はすべて縦横の座標とその値を 評価式 で計算する。

コマンド例

YUV、RGB どちらにも使える何も変化しないコマンド。ただし処理速度はかなり落ちる
ffplay input -vf geq='p(X,Y):p(X,Y):p(X,Y)'
左右反転。hflip フィルタと同じ
ffplay -f lavfi testsrc2,geq='p(W-X,Y)'
2×2 の分割表示
ffplay -f lavfi -i testsrc2,geq='p(mod(2*X,W),mod(2*Y,H))'
上は負荷が大きいので scale,split,vstack,split,hstack を併用した方がよい
ffplay -f lavfi -i testsrc2,scale=iw/2:-1:flags=neighbor,split,vstack,split,hstack
π/3 に傾けて、100ピクセル幅のサイン波を表示する
ffplay -f lavfi -i color,geq='128+100*sin(2*(PI/100)*(cos(PI/3)*(X-50*T)+sin(PI/3)*Y)):128:128'
エンボス効果
ffplay -f lavfi testsrc2,geq='(p(X,Y)+(256-p(X-4,Y-4)))/2'
RGB映像を座標によって RGB の値を変える
ffplay -f lavfi testsrc,geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)'
中央を明るく、四隅を次第に暗くする vignette フィルタのような効果
ffplay -f lavfi -i color,geq='255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0):128:128'

geq フィルタは処理が重たいので映像に変化がないなら trim フィルタで1フレームだけ取り出して loop フィルタで繰り返した方がよい
ffplay -f lavfi -i color,geq='st(0,between(X,W/3,2*W/3)*between(Y,H/3,2*H/3));ld(0)*255:128:128',trim=end_frame=1,loop=-1:1:0,setpts=N/FRAME_RATE/TB
公式ドキュメント:FFmpeg Filters Documentation : geq

オプション

数値を指定すれば全画面が指定した色になる。評価式を指定すれば座標毎に色を変えたり動かしたりできる。

  • lum_expr, lum[string]
    輝度(Y)の設定。YUV の値を変えるなら必須項目
    既定値:未設定
  • cb_expr, cb[string]
    彩度(U)の設定
    既定値:lum と同じ値
  • cr_expr, cr[string]
    彩度(V)の設定
    既定値:lum と同じ値
  • alpha_expr, a[string]
    透過(A)の設定
    既定値:元映像のまま
  • red_expr, r[string]
    赤(R)の設定。RGB の値を変えるなら RGB のどれか1つが必須項目
    既定値:元映像のまま
  • green_expr, g[string]
    緑(G)の設定。RGB の値を変えるなら RGB のどれか1つが必須項目
    既定値:元映像のまま
  • blue_expr, b[string]
    青(B)の設定。RGB の値を変えるなら RGB のどれか1つが必須項目
    既定値:元映像のまま

使える評価式

  • N
    0 から始まるフレーム番号
  • X, Y
    入力映像の横と縦の解像度で 0 からはじまり W, H までを返す
  • W, H
    入力映像の横と縦の解像度。固定値
  • SW, SH
    ピクセルフォーマットに合わせた横と縦の解像度比。YUV 4:2:0 の輝度は 1, 1、彩度は 0.5, 0.5 になる
  • T
    0 から始まるタイムスタンプ秒
  • p(x, y)
    入力映像の該当チャンネルの横と縦の値を指定し、その座標の値を返す
  • lum(x, y)
    入力映像の輝度(Y)チャンネルの指定した横と縦の値を返す
  • cb(x, y)
    入力映像の彩度(U)チャンネルの指定した横と縦の値を返す
  • cr(x, y)
    入力映像の彩度(V)チャンネルの指定した横と縦の値を返す
  • r(x, y)
    入力映像の赤チャンネルの指定した横と縦の値を返す
  • g(x, y)
    入力映像の緑チャンネルの指定した横と縦の値を返す
  • b(x, y)
    入力映像の青チャンネルの指定した横と縦の値を返す
  • alpha(x, y)
    入力映像の透過チャンネルの指定した横と縦の値を返す

マスクにも使えるコマンドサンプル

0 と 255 だけにマスクするのなら YUV でも RGB でもよいが、グラデーションにする場合 YUV だと限定レンジを超えた値(Y だと15以下と236以上、UV だと 15以下と241以上)で RGB 変換するとその値がグラデーションにならないのに注意する。RGB に変換せずに グラデーションを使うには A(アルファチャンネル) をつかう。

矩形

横*縦 で範囲を決めて最後に *255 で Y の値を指定している。矩形を狭くすれば縦や横のラインになる

矩形

ffplay -f lavfi -i color,geq='(between(X,W/3,2*W/3)*between(Y,H/3,2*H/3))*255:128:128'
横のライン
ffplay -f lavfi -i color,geq='(between(X,10,2*100)*between(Y,5,10))*255:128:128'
縦のライン
ffplay -f lavfi -i color,geq='(between(X,5,10)*between(Y,10,2*100))*255:128:128'
加算すれば矩形を追加できる
ffplay -f lavfi -i color,geq='(between(X,10,2*100)*between(Y,5,2*5)+between(X,200,2*150)*between(Y,50,55))*255:128:128'

drawbox

drawbox フィルタと同じことも出来る。矩形を書いてその中心を反対の色で埋める

drawbox

ffplay -f lavfi -i color,geq='(between(X,10,2*100)*between(Y,10,100))*255+(between(X,15,195)*between(Y,15,95)):128:128'

pow() の第一引数で横と縦の座標を決め lt() の第二引数で円の半径の2乗を指定する。pow() に変えてもよい


ffplay -f lavfi -i color,geq='lte(pow(X-(W/2),2)+pow(Y-(H/2),2),80*80)*255':128:128
drawbox と同様に中を抜いて線で円を描くことも出来る


ffplay -f lavfi -i color,geq='st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));lte(ld(0),80*80)*255+lte(ld(0),79*79)':128:128

破線

最初2つの between() で座標を指定し、3番目の between(mod()) で何ピクセル毎に白黒を繰り返すか指定する。例では20ピクセル毎に1から10までは白、11から20までは黒になる

破線

ffplay -f lavfi -i color,geq='between(X,0,W)*between(Y,5,10)*between(mod(X,20),0,9)*255:128:128'

ffplay -f lavfi -i color,geq='between(X,5,10)*between(Y,0,H)*between(mod(Y,20),0,9)*255:128:128'

グラデーション

右から左、上から下またはその逆や特定座標から左右上下にグラデーションする

グラデーション

ffplay -f lavfi -i color,geq=r='ceil(255*X/W)':g='255-ceil(255*X/W)':b='255-ceil(255*Y/H)'

左から右に黒から白
ffplay -f lavfi -i color,geq='r=ceil(255*X/W):g=ceil(255*X/W):b=ceil(255*X/W)'
左から右に白から黒
ffplay -f lavfi -i color,geq='r=255-ceil(255*X/W):g=255-ceil(255*X/W):b=255-ceil(255*X/W)'
上から下に黒から白
ffplay -f lavfi -i color,geq='r=ceil(255*Y/H):g=ceil(255*Y/H):b=ceil(255*Y/H)'
上から下に白から黒
ffplay -f lavfi -i color,geq='r=255-ceil(255*Y/H):g=255-ceil(255*Y/H):b=255-ceil(255*Y/H)'
200ピクセル右にずらし左右にグラデーション

オフセット座標のグラデーション

ffplay -f lavfi -i color,geq='r=clip(255-sqrt(pow(X-200,2)),0,255):g=clip(255-sqrt(pow(X-200,2)),0,255):b=clip(255-sqrt(pow(X-200,2)),0,255)'
100ピクセル下にずらし上下にグラデーション
ffplay -f lavfi -i color,geq='r=clip(255-sqrt(pow(Y-100,2)),0,255):g=clip(255-sqrt(pow(Y-100,2)),0,255):b=clip(255-sqrt(pow(Y-100,2)),0,255)'
RGB に変換せず A を使ってもグラデーションになる
ffplay -f lavfi -i color,format=yuva420p,geq=128:a='clip(255-sqrt(pow(X,2)+pow(Y,2)),0,255)',alphaextract

円グラデーション

円グラデーション

中心が左上ffplay -f lavfi -i color,geq=r='clip(255-sqrt(pow(X,2)+pow(Y,2)),0,255)':g='clip(255-sqrt(pow(X,2)+pow(Y,2)),0,255)':b='clip(255-sqrt(pow(X,2)+pow(Y,2)),0,255)'
中心が左下
ffplay -f lavfi -i color,geq='r=clip(255-sqrt(pow(X,2)+pow((Y-H),2)),0,255):g=clip(255-sqrt(pow(X,2)+pow((Y-H),2)),0,255):b=clip(255-sqrt(pow(X,2)+pow((Y-H),2)),0,255)'
中心が右上
ffplay -f lavfi -i color,geq='r=clip(255-sqrt(pow((X-W),2)+pow(Y,2)),0,255):g=clip(255-sqrt(pow((X-W),2)+pow(Y,2)),0,255):b=clip(255-sqrt(pow((X-W),2)+pow(Y,2)),0,255)'
中心が右下
ffplay -f lavfi -i color,geq='r=clip(255-sqrt(pow((X-W),2)+pow((Y-H),2)),0,255):g=clip(255-sqrt(pow((X-W),2)+pow((Y-H),2)),0,255):b=clip(255-sqrt(pow((X-W),2)+pow((Y-H),2)),0,255)'
sqrt の倍数を小さくするとグラデーションが広くなる
ffplay -f lavfi -i color,geq=r='clip(255-0.5*sqrt(pow(X,2)+pow(Y,2)),0,255)':g='clip(255-0.5*sqrt(pow(X,2)+pow(Y,2)),0,255)':b='clip(255-0.5*sqrt(pow(X,2)+pow(Y,2)),0,255)'
255/(W/2)*sqrt で左右の端が0になる
ffplay -f lavfi -i color,geq='r=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/(W/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(W/2,2))*ld(1):g=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/(W/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(W/2,2))*ld(1):b=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/(W/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(W/2,2))*ld(1)'
255/hypot(W/2,H/2) で四隅が0になる
ffplay -f lavfi -i color,geq='r=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/hypot(W/2,H/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(hypot(W/2,H/2),2))*ld(1):g=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/hypot(W/2,H/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(hypot(W/2,H/2),2))*ld(1):b=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-255/hypot(W/2,H/2)*sqrt(ld(0)),0,255));lte(ld(0),pow(hypot(W/2,H/2),2))*ld(1)'
円の半径を決めてグラデーション
lte(ld(0),pow()) で円の半径を決める。sqrt の倍数と併用する
ffplay -f lavfi -i color,geq='r=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-1*sqrt(ld(0)),0,255));lte(ld(0),pow(100,2))*ld(1):g=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-1*sqrt(ld(0)),0,255));lte(ld(0),pow(100,2))*ld(1):b=st(0,pow(X-(W/2),2)+pow(Y-(H/2),2));st(1,clip(255-1*sqrt(ld(0)),0,255));lte(ld(0),pow(100,2))*ld(1)'

幅の広いグラデーション

st() が分割数の指定

幅の広いグラデーション

左から黒から白へffplay -f lavfi -i color,geq=r='st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0))):g=st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0))):b=st(0,14);(255/(ld(0)-1))*trunc(X/(W/ld(0)))'
左から白から黒へ
ffplay -f lavfi -i color,geq=r='st(0,14);255-(255/(ld(0)-1))*trunc(X/(W/ld(0))):g=st(0,14);255-(255/(ld(0)-1))*trunc(X/(W/ld(0))):b=st(0,14);255-(255/(ld(0)-1))*trunc(X/(W/ld(0)))'
上から黒から白へ
ffplay -f lavfi -i color,geq=r='st(0,14);(255/(ld(0)-1))*trunc(Y/(H/ld(0))):g=st(0,14);(255/(ld(0)-1))*trunc(Y/(H/ld(0))):b=st(0,14);(255/(ld(0)-1))*trunc(Y/(H/ld(0)))'
上から白から黒へ
ffplay -f lavfi -i color,geq=r='st(0,14);255-(255/(ld(0)-1))*trunc(Y/(H/ld(0))):g=st(0,14);255-(255/(ld(0)-1))*trunc(Y/(H/ld(0))):b=st(0,14);255-(255/(ld(0)-1))*trunc(Y/(H/ld(0)))'

ffmpeg 3.3 リリース

$
0
0

2017年4月14日、ffmpeg 3.3 Hilbert(ヒルベルト)がリリースされた。3.3 は 3.2 からのメジャーアップデートでこれまでに取り込まれたコミットのすべてが入っている。

前回更新記事:ffmpeg 3.2 リリース

git.ffmpeg.org Git – ffmpeg.git/blob – RELEASE_NOTES
git.videolan.org Git – ffmpeg.git/blob – Changelog

追加されたフィルタで記事にしているフィルタ一覧
閾値の指定で2つのフィルタを使い分けやすくする threshold
2つの映像のヒストグラムをうまく揃えるように調整する midequalizer

フィルタ以外の注目点
PhotoShop の PSD が読み込めるようになったが、レイヤーのすべての各チャンネルにアクセスできるわけではないのでプレビュー程度に使う。deinterlace_qsv, scale_qsv フィルタの追加により、インターレース解除とリサイズ、エンコードがすべて QSV で行えるようになった。Opus を使うのに外部ライブラリを使わなくても使えるようになったが品質についての詳細は不明。

  • PSD Decoder
  • VAAPI-accelerated MPEG-2 and VP8 encoding
  • native Opus encoder
  • Intel QSV video scaling and deinterlacing filters

チェンジログ一覧にない部分では deinterlacer_vaapi フィルタの追加により QSV と同様にインターレース解除とリサイズscale_vaapi、エンコードh264_vaapiがすべて vaapi で行えるようになった。そして –enable-decklinknon-free になったので配布できなくなった。また HLS 関係のコミットが多く含まれているので挙動の変化に注意。

QSV の使い方は qsv 対応の ffmpeg をつくる を参照。

白と黒を使ったフェード効果

$
0
0

白や黒にフェードインする効果と、白や黒から入力した映像にフェードアウトする効果の解説。入力した映像が YUV、または RGB で処理が異なる。効果は2秒から4秒に掛けての2秒間で行う。適宜効果の時間は設定を変える。

関連記事
数式で線や円、模様が描ける geq
特定の区間だけフィルタを当てるタイムライン編集について

YUV

T-2 が開始2秒からと、それを2で割って2秒間フェード効果を与える。フェード効果の開始秒と終了秒でタイムライン編集の時間を変える。

黒から入力した映像
ffplay -f lavfi -i testsrc2 -vf lutyuv=0:128:128:enable=lt'(t,2)',geq='p(X,Y)*clip((T-2)/2,0,1)':'st(0,128*clip((T-2)/2,0,1));clip(p(X,Y),128-ld(0),128+ld(0))':enable=between'(t,2,4)'
白から入力した映像
ffplay -f lavfi -i testsrc2 -vf lutyuv=255:128:128:enable=lt'(t,2)',geq='clip(255-255*clip((T-2)/2,0,1)+p(X,Y),0,255)':'st(0,128*clip((T-2)/2,0,1));clip(p(X,Y),128-ld(0),128+ld(0))':enable=between'(t,2,4)'
入力した映像から黒
ffplay -f lavfi -i testsrc2 -vf geq='clip(p(X,Y)-255*clip((T-2)/2,0,1),0,255)':'st(0,128*clip((T-2)/2,0,1));clip(p(X,Y),clip(ld(0),0,128),clip(255-ld(0),128,255))':enable=between'(t,2,4)',lutyuv=0:128:128:enable=gt'(t,4)'
入力した映像から白
ffplay -f lavfi -i testsrc2 -vf geq='clip(255*clip((T-2)/2,0,1)+p(X,Y),0,255)':'st(0,128*clip((T-2)/2,0,1));clip(p(X,Y),clip(ld(0),0,128),clip(255-ld(0),128,255))':enable=between'(t,2,4)',lutyuv=255:128:128:enable=gt'(t,4)'

RGB

黒から入力した映像
ffplay -f lavfi -i testsrc -vf lutrgb=0:0:0:enable=lt'(t,2)',geq=r='p(X,Y)*clip((T-2)/2,0,1)':g='p(X,Y)*clip((T-2)/2,0,1)':b='p(X,Y)*clip((T-2)/2,0,1)':enable=between'(t,2,4)'
白から入力した映像
ffplay -f lavfi -i testsrc -vf lutrgb=255:255:255:enable=lt'(t,2)',geq=r='clip(255-255*clip((T-2)/2,0,1)+p(X,Y),0,255)':g='clip(255-255*clip((T-2)/2,0,1)+p(X,Y),0,255)':b='clip(255-255*clip((T-2)/2,0,1)+p(X,Y),0,255)':enable=between'(t,2,4)'
入力した映像から黒
ffplay -f lavfi -i testsrc -vf geq=r='clip(p(X,Y)-255*clip((T-2)/2,0,1),0,255)':g='clip(p(X,Y)-255*clip((T-2)/2,0,1),0,255)':b='clip(p(X,Y)-255*clip((T-2)/2,0,1),0,255)',lutrgb=0:0:0:enable=gt'(t,4)'
入力した映像から白
ffplay -f lavfi -i testsrc -vf geq=r='clip(255*clip((T-2)/2,0,1)+p(X,Y),0,255)':g='clip(255*clip((T-2)/2,0,1)+p(X,Y),0,255)':b='clip(255*clip((T-2)/2,0,1)+p(X,Y),0,255)',lutrgb=255:255:255:enable=gt'(t,4)'

ドラクエの戦闘シーンチェンジエフェクトを作る

$
0
0

ニコニコ動画に投稿された「DQエンカウント風AviUtlシーンチェンジ用素材 sm30578410」を元に ffmpeg でも同じことを実装する。配布されたファイルは 8bit PNG なのでそれを使い、グラデーションマスクを作成し2入力を合わせる方法をとる。サンプルコマンドの出力コーデックは適宜変える。input1.mp4 と input2.mp4 は 640×360 30000/1001 fps の動画である。それに伴って。color ソースもそれに統一する。シーンチェンジは input1.mp4 から input2.mp4 の順番に切り替わるのがドラクエの戦闘シーンチェンジエフェクトになる。

ドラクエIの戦闘エフェクト

ffmpeg -loop 1 -i "DQ1エンカウント風.png" -f lavfi -i color=s=640x360:r=30000/1001,format=yuva420p -i input1.mp4 -i input2.mp4 -filter_complex fps=30000/1001,scale=640:360:flags=neighbor,setsar=1/1,format=yuva420p,shuffleplanes=0:1:2:0[0a];[2]lut=val:128:128:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,1.5,2)',format=yuva420p[2a];[0a][1]blend=c3_expr='gt(A,(T-2)*255)*255',[2a]lut2=x:x:x:y,[3]overlay[v];[2:a]atrim=duration=2,asetpts=PTS-STARTPTS[a2];[3:a]atrim=2,asetpts=PTS-STARTPTS[a3];[a2][a3]concat=v=0:a=1[a] -map [v] -map [a] -t 6 -vcodec ffv1 -acodec aac dq1.mkv

解説

  • 入力順に、エフェクト画像、エフェクト画像を映像にするテストソース、シーンチェンジ前の映像、シーンチェンジ後の映像
  • color=s=640x360:r=30000/1001,format=yuva420p
    テストソースの解像度とフレームレートの指定。アルファチャンネルを追加する
  • scale=640:360:flags=neighbor,setsar=1/1,format=yuva420p,shuffleplanes=0:1:2:0
    エフェクト画像を neighbor で補間なしのリサイズし、画像の sar を揃えアルファチャンネルを追加し、輝度チャンネルをアルファチャンネルにコピーする
  • lut=val:128:128:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,1.5,2)',format=yuva420p
    グレーに色を点滅し、タイムライン編集でシーンチェンジ前の点滅を 1.5秒から2秒の間に作り、アルファチャンネルを追加する
  • blend=c3_expr='gt(A,(T-2)*255)*255'
    アルファチャンネルに開始2秒から1秒間で徐々に255(透過しない)にする
  • lut2=x:x:x:y
    2入力のアルファチャンネルを1入力のと入れ換える

ドラクエⅡの戦闘エフェクト

ffmpeg -loop 1 -i "DQ2エンカウント風.png" -f lavfi -i color=s=640x360:r=30000/1001,format=yuva420p -i input1.mp4 -f lavfi -i color=s=640x360:r=30000/1001 -i input2.mp4 -filter_complex fps=30000/1001,scale=640:360:flags=neighbor,setsar=1/1,format=yuva420p,shuffleplanes=0:1:2:0[0a];[2]lut=val:128:128:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,1.5,2)',format=yuva420p[2a];[0a][1]blend=c3_expr='gt(A,(T-2)*255)*255',[2a]lut2=x:x:x:y,[3]overlay,trim=duration=3,setpts=PTS-STARTPTS[23];[4]trim=3,setpts=PTS-STARTPTS,[23]concat[v];[2:a]atrim=duration=2,asetpts=PTS-STARTPTS[a2];[4:a]atrim=2,asetpts=PTS-STARTPTS,[a2]concat=v=0:a=1[a] -map [v] -map [a] -t 6 -vcodec ffv1 -acodec aac dq2.mkv

解説

ドラクエIの戦闘エフェクトから違う部分だけ。シーンチェンジの背景が黒になるのがドラクエIの戦闘エフェクトと違う

  • 入力順に、エフェクト画像、エフェクト画像を映像にするテストソース、シーンチェンジ前の映像、シーンチェンジ背景の黒映像、シーンチェンジ後の映像
  • overlay,trim=duration=3,setpts=PTS-STARTPTS
    シーンチェンジ背景が黒映像なので背景を透過させて黒映像を映す。あとで concat するので trim する
  • trim=3,setpts=PTS-STARTPTS
    シーンチェンジ後の映像をつなげるために trim で開始時間をずらす

ドラクエⅢの戦闘エフェクト

上2つのエフェクト以外はこのコマンド例を使う
ffmpeg -loop 1 -i "DQ3エンカウント風.png" -f lavfi -i color=s=640x360:r=30000/1001 -i input1.mp4 -i input2.mp4 -filter_complex fps=30000/1001,scale=640:360:flags=neighbor,setsar=1/1,format=yuva420p,shuffleplanes=0:1:2:0[0a];[2]lut=val:128:128:enable='st(0,between((mod(n,4)),0,1));ld(0)*between(t,1.5,2)',format=yuva420p[2a];[0a][1]blend=c3_expr='gt(A,(T-2)*255)*255',[2a]lut2=x:x:x:y,[1]overlay,trim=duration=3[23];[3]trim=3:4,setpts=PTS-STARTPTS,geq='p(X,Y)*clip(T,0,1)':'clip(p(X,Y),128-clip(T*128,0,128),128+clip(T*128,0,128))'[3a];[3]trim=4,setpts=PTS-STARTPTS,[23][3a]concat=3[v];[2:a]atrim=duration=2,asetpts=PTS-STARTPTS[a2];[3:a]atrim=2,asetpts=PTS-STARTPTS,[a2]concat=v=0:a=1[a] -map [v] -map [a] -t 6 -vcodec ffv1 -acodec aac dq3.mkv

解説

ドラクエⅡの戦闘エフェクトに加えて黒映像からのフェードアウトが追加される
白と黒を使ったフェード効果 を参照
入力順に、エフェクト画像、エフェクト画像を映像にするテストソース、シーンチェンジ前の映像、シーンチェンジ後の映像

個別フィルタの解説

ffmpeg で先頭と後ろを一度にカットする

$
0
0

Cut video with ffmpeg. – Stack Overflow より、再エンコードなしに1行のコマンドで先頭と後ろをカットする方法。

開始10秒と後ろ10秒をカットしてその間をコピー出力する
ffmpeg -ss 10 -i video.mp4 -ss 20 -i video.mp4 -c copy -map 1:0 -map 0 -shortest -f nut - | ffmpeg -f nut -i - -map 0 -map -0:0 -c copy out.mp4

  • このコマンドの挙動の理解には shortest, map, nut を知る必要がある
  • -shortest は2入力以上に対応していないので、1入力のトラックの中から一番短いファイル時間でカットされる
  • 1番目の -ss で動画の先頭時間の指定、2番目の -ss と1番目の -ss の差し引きが後ろをカットする時間になる
  • -map 1:0 -map 0 を使ってそれらを1入力扱いにして、そのトラックに中から -shortest で一番時間の短いところで出力時間が決まる
  • なぜ -map 1:0 を先にするかというと、この映像はカットするための時間を決める動画で最終出力には不要になりかつ、トラックを除外しやすい -map 0:0 でパイプ入力するため
  • -f nut はいろいろなコーデックをパイプ入出力できるので便利
  • パイプ入力で -map 0 しているのは映像と音声、または字幕などのすべてのデータを元に -shortest で後ろをカットするから
  • -map 0:0 で不要なトラックを除外して出力している

新配信(β)で4:3映像に余白をつけて800×450配信にする

$
0
0

元映像が4:3なら丁度よい解像度にリサイズし余白をつけて推奨解像度の800×450にする。余白の色の既定値は黒で適宜指定できる。配信映像がドット絵なら neighbor を指定し、それ以外は lanczosbicubic(無指定ならこれ) を指定する。
scale=576:432:flags=neighbor,fifo,pad=800:450:112:9:black

Windows の ffmpeg で生放送する方法 : scale
Windows の ffmpeg で生放送する方法 : pad

生放送をNLEなどの外部ツールで高画質配信する | ニコニコヘルプ


4:3を16:9に、16:9を4:3に余白をつける

$
0
0

ffmpeg に pad フィルタがあるのでこれを使って4:3を16:9に、16:9を4:3に余白をつける。コマンド例は黒映像に余白は白を足している。

640×360の16:9映像を上下に白枠を付けて4:3にする。出力解像度は 640×480
ffplay -f lavfi -i color=s=640x360 -vf pad=iw:iw*3/4:0:(oh-ih)/2:white
640×480の4:3映像を左右に白枠を付けて16:9にする。出力解像度は 852×480
ffplay -f lavfi -i color=s=640x480 -vf pad=ih*16/9:ih:(ow-iw)/2:0:white

4:3を16:9に、16:9を4:3に余白と透過をつける

$
0
0

前回記事は余白だけをつけたが今回はその余白の部分だけ透過させる。映像の部分的に透過させるには geq フィルタを使う。アルファチャンネルをプレビューするには alphaextract フィルタを使う。

640×360の16:9映像を上下に白枠と透過を付けて4:3にする。出力解像度は 640×480
ffplay -f lavfi -i color=s=640x360 -vf format=yuva420p,pad=iw:iw*3/4:0:(oh-ih)/2:white,geq='p(X,Y):a=(between(X,0,W)*between(Y,H/8,7*H/8))*255'
640×480の4:3映像を左右に白枠と透過を付けて16:9にする。出力解像度は 852×480
ffplay -f lavfi -i color=s=640x480 -vf format=yuva420p,pad=ih*16/9:ih:(ow-iw)/2:0:white,geq='p(X,Y):a=(between(X,W/8,7*W/8)*between(Y,0,H))*255'

APNG をループ出力する

$
0
0

Using ffmpeg to create looping apng – Stack Overflow より、アニメGIF なら loop でループできるのに APNG ではこのオプションではループできないので plays オプションを使う。このオプションはループ回数を指定する。ただし -1 を指定して無限ループは出来ないので大きい値を指定する。

ss で開始秒、t で動画時間を指定する
ffmpeg -ss 10 -i input.mp4 -plays 10 -t 1 -vf setpts=PTS-STARTPTS output.apng

【APNG】ブロマガのサムネイルを動かす方法
ffmpeg で アニメーションWebP(Animated WebP)を作る

分割画面の効果を作る

$
0
0

ffmpeg の geq フィルタとタイムライン編集を使って複数の分割画面の効果を作る。単純に1度だけ分割画面の効果を作るのなら split,vstack,split,hstack フィルタの併用が最も手軽。

0秒から1秒まで普通で、1秒から2秒の間は2×2の映像になり、2秒から3秒の間は3×3の映像になり、3秒から4秒の間は4×4の映像になり、4秒以降は元に戻る。
ffplay -f lavfi -i testsrc2,geq='p(mod(2*X,W),mod(2*Y,H)):enable=between(t,1,2)',geq='p(mod(3*X,W),mod(3*Y,H)):enable=gt(t,2)*lte(t,3)',geq='p(mod(4*X,W),mod(4*Y,H)):enable=gt(t,3)*lte(t,4)'
ffplay -i input -vf geq='p(mod(2*X,W),mod(2*Y,H)):enable=between(t,1,2)',geq='p(mod(3*X,W),mod(3*Y,H)):enable=gt(t,2)*lte(t,3)',geq='p(mod(4*X,W),mod(4*Y,H)):enable=gt(t,3)*lte(t,4)'

VP9(libvpx-vp9) のエンコード設定について

$
0
0

次世代エンコーダ VP9 のエンコード設定について ffmpeg で使ったときの設定をまとめた。libvpx-vp9 は外部ライブラリなので別途インストールする必要がある。さらに音声のエンコーダで使われる libopus も外部ライブラリなのでこれもインストールする必要がある。

設定内容は多くあるがほとんどの設定は何も変えず、ビットレートの設定と品質・速度のトレードオフの設定を変える。VP9 で処理が遅いとよく言われるが、これは仕様上、現在ではどうにもならないので2つ3つ同時にエンコードして1つにつなげる方法をとれば処理は速くなる。

webmproject/libvpx: github.com
Downloads – Opus Codec
CompilationGuide/Quick/libopus – FFmpeg

基本コマンド

ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus -b:a 128k output.webm
libopus をインストールしていない場合
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a opus -b:a 128k -strict -2 output.webm
2pass エンコード例
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -pass 1 -an -f null -
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -pass 2 -c:a libopus -b:a 128k output.webm

linux などの 1pass 目の例
ffmpeg -i input -c:v libvpx-vp9 -crf 30 -b:v 0 -pass 1 -an -f webm /dev/null
分割エンコードしてつなげるコマンド例
ffmpeg -f concat -safe 0 -i input.txt -c copy output.webm
input.txt の内容

file output-0.webm
file output-1.webm

詳しくは 【ffmpeg】動画・音声を連結する concat の使い方 其の3

ビットレート指定

以下の設定のどれかを必ず指定する

  • 平均ビットレート
    -c:v libvpx-vp9 -b:v 1M
  • 品質指定(-1 から 63 まで低い値ほど高品質) -b:v 0 は必須項目
    -c:v libvpx-vp9 -crf 30 -b:v 0
  • 品質指定で上限ビットレートを指定する。最大品質が crf=30 で平均ビットレートが 1000k になる
    -c:v libvpx-vp9 -crf 30 -b:v 1000k
  • 固定ビットレート、最小と最大を一致させる
    -c:v libvpx-vp9 -minrate 1M -maxrate 1M -b:v 1M
  • ロスレス(可逆圧縮)
    -c:v libvpx-vp9 -lossless 1

エンコード設定

ffmpeg -h encoder=libvpx-vp9 で見られるエンコード設定とエンコーダ全般に指定できる設定の2つがある。以下は libvpx-1.6.1 より

Encoder libvpx-vp9 [libvpx VP9]:
    General capabilities: delay threads 
    Threading capabilities: auto
    Supported pixel formats: yuv420p yuva420p yuv422p yuv440p yuv444p gbrp
libvpx-vp9 encoder AVOptions:
  -auto-alt-ref      [int]        E..V.... Enable use of alternate reference frames (2-pass only) (from -1 to 2) (default -1)
  -lag-in-frames     [int]        E..V.... Number of frames to look ahead for alternate reference frame selection (from -1 to INT_MAX) (default -1)
  -arnr-maxframes    [int]        E..V.... altref noise reduction max frame count (from -1 to INT_MAX) (default -1)
  -arnr-strength     [int]        E..V.... altref noise reduction filter strength (from -1 to INT_MAX) (default -1)
  -arnr-type         [int]        E..V.... altref noise reduction filter type (from -1 to INT_MAX) (default -1)
     backward                     E..V....
     forward                      E..V....
     centered                     E..V....
  -tune              [int]        E..V.... Tune the encoding to a specific scenario (from -1 to INT_MAX) (default -1)
     psnr                         E..V....
     ssim                         E..V....
  -deadline          [int]        E..V.... Time to spend encoding, in microseconds. (from INT_MIN to INT_MAX) (default good)
     best                         E..V....
     good                         E..V....
     realtime                     E..V....
  -error-resilient   [flags]      E..V.... Error resilience configuration (default 0)
     default                      E..V.... Improve resiliency against losses of whole frames
     partitions                   E..V.... The frame partitions are independently decodable by the bool decoder, meaning that partitions can be decoded even though earlier partitions have been lost. Note that intra predicition is still done over the partition boundary.
  -max-intra-rate    [int]        E..V.... Maximum I-frame bitrate (pct) 0=unlimited (from -1 to INT_MAX) (default -1)
  -crf               [int]        E..V.... Select the quality for constant quality mode (from -1 to 63) (default -1)
  -static-thresh     [int]        E..V.... A change threshold on blocks below which they will be skipped by the encoder (from 0 to INT_MAX) (default 0)
  -drop-threshold    [int]        E..V.... Frame drop threshold (from INT_MIN to INT_MAX) (default 0)
  -noise-sensitivity [int]        E..V.... Noise sensitivity (from 0 to 4) (default 0)
  -undershoot-pct    [int]        E..V.... Datarate undershoot (min) target (%) (from -1 to 100) (default -1)
  -overshoot-pct     [int]        E..V.... Datarate overshoot (max) target (%) (from -1 to 1000) (default -1)
  -cpu-used          [int]        E..V.... Quality/Speed ratio modifier (from -8 to 8) (default 1)
  -lossless          [int]        E..V.... Lossless mode (from -1 to 1) (default -1)
  -tile-columns      [int]        E..V.... Number of tile columns to use, log2 (from -1 to 6) (default -1)
  -tile-rows         [int]        E..V.... Number of tile rows to use, log2 (from -1 to 2) (default -1)
  -frame-parallel    [boolean]    E..V.... Enable frame parallel decodability features (default auto)
  -aq-mode           [int]        E..V.... adaptive quantization mode (from -1 to 4) (default -1)
     none                         E..V.... Aq not used
     variance                     E..V.... Variance based Aq
     complexity                   E..V.... Complexity based Aq
     cyclic                       E..V.... Cyclic Refresh Aq
     equator360                   E..V.... 360 video Aq
  -level             [float]      E..V.... Specify level (from -1 to 6.2) (default -1)
  -speed             [int]        E..V....  (from -16 to 16) (default 1)
  -quality           [int]        E..V....  (from INT_MIN to INT_MAX) (default good)
     best                         E..V....
     good                         E..V....
     realtime                     E..V....
  -vp8flags          [flags]      E..V....  (default 0)
     error_resilient              E..V.... enable error resilience
     altref                       E..V.... enable use of alternate reference frames (VP8/2-pass only)
  -arnr_max_frames   [int]        E..V.... altref noise reduction max frame count (from 0 to 15) (default 0)
  -arnr_strength     [int]        E..V.... altref noise reduction filter strength (from 0 to 6) (default 3)
  -arnr_type         [int]        E..V.... altref noise reduction filter type (from 1 to 3) (default 3)
  -rc_lookahead      [int]        E..V.... Number of frames to look ahead for alternate reference frame selection (from 0 to 25) (default 25)

この中で重要なのがエンコード速度と品質に関わる cpu-used, speed, quality と、馴染みのある crf である。cpu-used, speed はエンコード速度と品質に大きく影響する設定である。既定値は 1 で両方とも 0 にするとものすごくエンコード速度が落ちる代わりに圧縮率が向上する。値を上げるとそれだけ速度が向上するが品質も悪くなる。品質と速度の面から 2 や 3 も候補になるが 4 の品質はよくない。マイナスも指定できるがプラスの時と出力内容は変わらない。また quality realtime を指定することで 5 以上の設定もできる。

cpu-used [int]
マイナスも指定できるがプラスの時と出力内容は変わらない。0 にすると最高品質だがものすごく遅くなる。quality の既定値である good のときは -4 から 4 までしか効果が無い。quality realtime にすると -8 から 8 まで効果がある
範囲:-8 から 8 まで
既定値:1

speed [int]
マイナスも指定できるがプラスの時と出力内容は変わらない。0 にすると最高品質だがものすごく遅くなる。quality の既定値である good のときは -4 から 4 までしか効果が無い。quality realtime にすると -8 から 8 まで効果がある
範囲:-16 から 16 までとあるが、実際は -8 から 8 まで
既定値:1

quality [int]
品質指定。cpu-used, speed の設定を受け付けない best(一番高品質一番低速度)、good 既定値、realtime の3つの指定が出来る。設定を細かく分ける場合に realtime を指定する。
指定値:best, good, realtime
既定値:good

crf [int]
品質の数値指定。小さい値ほど高画質
範囲:-1 から 63 まで
既定値:-1

libvpx-vp9 の設定以外に品質の上限下限の指定と、キーフレーム間隔、色空間がある。

qmin [int]
既定値:-1

qmax [int]
既定値:-1

g [int]
keyint のこと
既定値:-1

keyint_min [int]
既定値:-1

colorspace [string]

  • rgb
  • bt709
  • unspecified
  • bt470bg
  • smpte170m
  • smpte240m
  • bt2020_ncl

推奨ビットレートと品質設定

Recommended Settings for VOD  |  Google Developers より
ビットレートの下限は指定ビットレートの50%、上限は145%としている

Frame Size/Frame Rate Target Bitrate (VOD, kbps) Min Bitrate (50%) Max Bitrate (145%)
320x240p @ 24,25,30 150 75 218
640x360p @ 24,25,30 276 138 400
640x480p @ 24,25,30 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280x720p @ 24,25,30 1024 512 1485
1280x720p @ 50,60 1800 900 2610
1920x1080p @ 24,25,30 1800 900 2610
1920x1080p @ 50,60 3000 1500 4350
2560x1440p @ 24,25,30 6000 3000 8700
2560x1440p @ 50,60 9000 4500 13050
3840x2160p @ 24,25,30 12000 6000 17400
3840x2160p @ 50,60 18000 9000 26100

縦解像度と品質指定(crf)

Frame Height Target Quality (CQ)
240 37
360 36
480 34 (LQ) or 33 (MQ)
720 32
1080 31
1440 24
2160 15

VP9 の解説記事(英語)

VP9 – Wikipedia VP9 の解説
How VP9 works, technical details & diagrams – Doom9’s Forum VP9 の解説
Do VP9 have B-frame or P-frame ? – Doom9’s Forum VP9 には B-frame がない代わりに alternate reference frames がある
Instructions to playback Adaptive WebM using DASH – wiki DASH向けにエンコード
VP9 Encoding Guide – wiki エンコード設定
The WebM Project | VP8 Encode Parameter Guide エンコード設定

音声をサラウンド変換する surround

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。入力した音声の周波数からフロントとリアの音声を分けてサラウンド(5.1ch など)に変換する surround フィルタの使い方。

基本コマンド

アンプなどにもよるがサラウンドは 48KHz じゃないとサラウンドでデコードしないこともある。コーデックも aac や pcm よりも ac3 のほうがデコードの汎用性が高い。既定値では入力音声のチャンネル数 chl_in はステレオになっている
ffmpeg -i input -af surround -ar 48000 -vcodec copy -acodec aac output.ts

sox がインストールされている場合は sox でリサンプリングする
ffmpeg -i input -af aresample=48000:resampler=soxr,surround -vcodec copy -acodec aac output.ts

サラウンドの各チャンネルを出力するには channelsplit フィルタを使う
ffmpeg -i input -filter_complex surround,channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR] -map [FL] FL.wav -map [FR] FR.wav -map [FC] FC.wav -map [LFE] LFE.wav -map [SL] SL.wav -map [SR] SR.wav
公式ドキュメント:FFmpeg Filters Documentation : surround

オプション

  • chl_out[string]
    出力チャンネル数。指定値は FFmpeg Utilities Documentation : Channel Layout を参照
    規定値:5.1
  • chl_in[string]
    入力チャンネル数。指定値は FFmpeg Utilities Documentation : Channel Layout を参照
    規定値:stereo
  • level_in[float]
    入力音量レベル
    規定値:1
  • level_out[float]
    出力音量レベル
    規定値:1
  • lfe[boolean]
    LFE(Low-frequency effect) チャンネル、いわゆるサラウンドチャンネルの 0.1ch のこと、の出力を許可する
    規定値:1(許可)
  • lfe_low[int]
    LFE カットオフの下限 Hz
    規定値:128
  • lfe_high[int]
    LFE カットオフの上限 Hz
    規定値:256

各チャンネルの音声を合わせたり調整する pan

$
0
0

各チャンネルの音声を合わせたり無音にしたりできる pan フィルタの使い方。

基本コマンド

c1(FR) をそのままに c0(FL) を無音にしたステレオ音声
ffmpeg -i input -af "pan=stereo|c1=c1"
c1(FR)c0(FL) を逆にしたステレオ音声
ffmpeg -i input -af "pan=stereo|c0=FR|c1=FL"
左右のチャンネルを同じだけ合わせたステレオ音声
ffmpeg -i input -af "pan=stereo|c0<1*FR+1*FL|c1<1*FR+1*FL"
公式ドキュメント:FFmpeg Filters Documentation : pan

オプション

最初の引数で出力チャンネル数を指定し、| で区切りながら各チャンネルの設定を行う。設定を行わなければ無音チャンネルになるc0 から順番にチャンネルが割り当てられその順番は channel-layout-compositions の順番に準ずる。

設定の順番は "l|outdef|outdef|..." になる。入力チャンネルを合わせるときに = または < を使うことができ、前者は合計が1を超えても超えなくてもそのまま合計する。後者は合計が1を超えても超えなくても1になるように調整し音量が大きすぎてクリップノイズが発生するのを抑える。

  • l
    出力チャンネルレイアウトmono, stereo, 2.1 と設定する方法と、出力チャンネル数 1c, 2c, 3c で設定する方法の2通りがある
  • outdef
    出力チャンネル数を設定したら次のように設定する "out_name=[gain*]in_name[(+-)[gain*]in_name...]"
  • out_name
    出力チャンネル名 mono, stereo, 2.1 と設定する方法と、出力チャンネル番号 1c, 2c, 3c で設定する方法の2通りがある
  • gain
    音量の累乗係数の設定。1 だと入力音量そのまま
  • in_name
    入力チャンネル名の設定。個別のチャンネルを合わせることも出来る

サラウンドをヘッドフォン用の2チャンネルに配置する headphone

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。サラウンドを HRIRs(head-related impulse response, 頭部インパルス応答) ファイルを元にチャンネルを配置しステレオとして出力する headphone フィルタの使い方。

HRIRs ファイルの配布ページが重たい場合はミラーを上げている。

HRIRs ファイルには DFC, MINP, RAW があり、基本コマンドには Subject_001_Wav.zip を使っている。

基本コマンド

5.1ch の音声に映像をコピーして 2ch で出力
ffmpeg -i input -i azi_30_ele_0_DFC.wav -i azi_330_ele_0_DFC.wav -i azi_0_ele_0_DFC.wav -i azi_100_ele_0_DFC.wav -i azi_260_ele_0_DFC.wav -filter_complex "[0:a][1][2][3][3][4][5]headphone=FL|FR|FC|LFE|BL|BR" -vcodec copy output.mp4
2ch の音声を 5.1ch に surround フィルタで変換し映像をコピーして 2ch で出力
ffmpeg -i input -i azi_260_ele_0_DFC.wav -i azi_100_ele_0_DFC.wav -i azi_0_ele_0_DFC.wav -i azi_30_ele_0_DFC.wav -i azi_330_ele_0_DFC.wav -filter_complex "[a:0]surround[0a];[0a][1][2][3][3][4][5]headphone=FL|FR|FC|LFE|BL|BR" -vcodec copy output.mp4
公式ドキュメント:FFmpeg Filters Documentation : headphone

オプション

ゲインの設定をしても音量が変わらず、チャンネルマッピング map 以外の設定の方法がよく分からない。個別チャンネルの音量設定は pan フィルタでもできる。

  • map[string]
    入力音声を配置し畳み込み処理をする。チャンネル毎に “|” で区切り、出力音声より多い数を入力する。基本は元となる音声にサラウンドのチャンネル数だけ HRIRs ファイルを入力する
  • gain[float]
    ゲイン(dB)の設定
    既定値:0
  • lfe[int]
    LFE ゲイン(dB)の設定
    既定値:0
  • type[float]
    処理形式の設定
    0, time (time domain processing ) 遅い
    1, freq (frequency domain processing) 速い
    既定値:1

各チャンネルの音量を映像化する abitscope

$
0
0

各チャンネルの音量(周波数ではない)を色別で横に並べて映像にする abitscope フィルタの使い方。出力フォーマットは RGBA。似たフィルタに showvolumeshowfreqs がある。

基本コマンド

ffmpeg -i input -filter_complex abitscope -acodec copy output
ffmpeg -re -i input -filter_complex abitscope -f sdl -

動画にオーバーレイする例
ffmpeg -i input -filter_complex abitscope,[0:v]overlay -acodec copy output
ffmpeg -re -i input -filter_complex abitscope,[0:v]overlay -f sdl -

abitscope フィルタで動画にオーバーレイする例(5.1ch なので6色)

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

オプション

  • rate, r[video_rate]
    フレームレートの設定
    既定値:25
  • size, s[image_size]
    解像度の設定
    既定値:1024×256
  • colors[string]
    チャンネル毎の色の設定。rrggbb 形式も可能。チャンネルが割り当てられる順番は channel-layout-compositions の順番に準ずる
    既定値:”red|green|blue|yellow|orange|lime|pink|magenta|brown”

エッジ検出フィルタ roberts

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。Roberts cross operator を用いたエッジ検出フィルタ roberts の使い方。同様のフィルタに sobel, prewitt があり、他にもエッジ検出できるフィルタはいくつかある。

エッジ検出フィルタ sobel, prewitt
ffmpeg でエッジ検出をする edgedetect
先鋭化やぼかし、エンボス処理などができる convolution
ffmpeg で使える frei0r フィルタの使い方

基本コマンド

ffmpeg -i input -vf roberts=planes=15:scale=1:delta=0 output
ffmpeg -i input -vf roberts=15:1:0 output
ffplay -i input -vf roberts=15:1:0

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

オプション

乗算、加算の値は増やせば線が増え、減らせば線が減る。

  • planes[int]
    フィルタを当てるチャンネル指定
    詳しくは ffmpeg について | チャンネルの順番と注意点 を参照
    既定値:15(すべて)
  • scale[float]
    フィルタを当てる乗算値の指定
    範囲:0 から 65535 まで
    既定値:1
  • delta[float]
    フィルタを当てる加算値の指定
    範囲:-65535 から 65535 まで
    既定値:0

サンプル画像

アニメ画像

アニメ「艦隊これくしょん~艦これ~」の11話の大和出撃のシーン

アニメ画像 roberts=1(1st plaen だけフィルタを当てている)

実写画像

実物大の戦艦大和

実写画像 roberts=1(1st plaen だけフィルタを当てている)

18の周波数帯に分けてゲインを調整する superequalizer

$
0
0

ffmpeg 3.4 から追加予定のフィルタ。compand フィルタのように設定した周波数の音量を調整するよりも手軽に特定周波数の音量を上げたり下げたり出来る superequalizer フィルタの使い方。

基本コマンド

以下のコマンドでは音量は変化しない
ffmpeg -i input -af superequalizer=1b=1:2b=1:3b=1:4b=1:5b=1:6b=1:7b=1:8b=1:9b=1:10b=1:11b=1:12b=1:13b=1:14b=1:15b=1:16b=1:17b=1:18b=1 output
ffmpeg -i input -af superequalizer=1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1 output
ffplay -i input -af superequalizer=1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1

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

オプション

  • 1b[float]
    65Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 2b[float]
    92Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 3b[float]
    131Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 4b[float]
    185Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 5b[float]
    262Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 6b[float]
    370Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 7b[float]
    523Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 8b[float]
    740Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 9b[float]
    1047Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 10b[float]
    1480Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 11b[float]
    2093Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 12b[float]
    2960Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 13b[float]
    4186Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 14b[float]
    5920Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 15b[float]
    8372Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 16b[float]
    11840Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 17b[float]
    16744Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで
  • 18b[float]
    20000Hz帯にゲインを設定する
    既定値:1
    範囲:0 から 20 まで

2ファイル入力するフィルタの挙動設定 framesync

$
0
0

一部のフィルタ(現在では blend, libvmaf, lut3d, overlay, psnr, ssim) で設定できる動画時間が異なるファイルの挙動設定を行う framesync の設定方法。以前は個別のフィルタ毎に設定していたがこれのおかげで設定内容が統一された。

公式ドキュメント:FFmpeg Filters Documentation : Options for filters with several inputs (framesync)

記事にしているフィルタ
Windows の ffmpeg で生放送する方法 : overlay
YUV RGB を比較計算する blend
2つの映像の画質評価をする SSIM

オプション

  • eof_action[int] 2ファイル目が終了したときの1ファイル目の挙動指定
    • repeat, 0
      最終フレームを繰り返す
      既定値
    • endall, 1
      両方のファイルを最後まで読み込む
    • pass, 2
      1ファイル目が終了したら2ファイル目に切り替える
  • shortest[boolean]
    時間の短いファイルが最後まで読み込んだら終了する
    既定値:0
  • repeatlast[boolean]
    1ファイル目が最後まで読み込んだら終了する
    既定値:1

コマンド例

以下の overlay フィルタは2ファイル目が映像に載る。
ファイル名はその動画時間(秒)。

2ファイル目を最後まで読み込む
ffmpeg -re -i 5.mp4 -re -i 10.mp4 -filter_complex overlay=eof_action=0 -f sdl -
2コマンドとも開始5秒で止まる
ffmpeg -re -i 5.mp4 -re -i 10.mp4 -filter_complex overlay=eof_action=1 -f sdl -
ffmpeg -re -i 5.mp4 -re -i 10.mp4 -filter_complex overlay=eof_action=2 -f sdl -

5秒まで映像が動きそれ以降は最終フレームが5秒続く
ffmpeg -re -i 10.mp4 -re -i 5.mp4 -filter_complex overlay=eof_action=0 -f sdl -
5秒で止まる
ffmpeg -re -i 10.mp4 -re -i 5.mp4 -filter_complex overlay=eof_action=1 -f sdl -
5秒まで読み込み終わると1ファイル目に切り替えてさらに5秒続く
ffmpeg -re -i 10.mp4 -re -i 5.mp4 -filter_complex overlay=eof_action=2 -f sdl -

Viewing all 311 articles
Browse latest View live
<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>