にわとり遊び
PC関連とエンコードの覚書き
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2つのクリップの開始位置を合わせる - Adjust2clip
※記述ミスがあったので修正

前記事のstacksubtractの出力結果から開始位置を合わせる関数です。
2つのクリップの開始フレーム位置を確認する - stacksubtract

function Adjust2clip (clip clip1,clip clip2,int n) {
clip2=(n==0) ? clip2 : (n>0) ? (n==1) ? clip1.Trim(0,-1)++clip2 : clip1.Trim(0,-1+n)++clip2 : clip2.Loop(0,0,-1+Abs(n))
clip2=Merge(clip1,clip2,1)
return clip2
}


clip2=Adjust2clip(clip1,clip2,0)
stacksubtract(clip1,clip2,1)

stackbs11.png

出力が上図であればn=1で開始位置が合います。
clip2=Adjust2clip(clip1,clip2,1)
stacksubtract(clip1,clip2,1)
スポンサーサイト
2つのクリップの開始フレーム位置を確認する - stacksubtract
※リサイズで差分が潰れる事があったので修正

開始フレームのズレを確認する関数。
clip1を基準として、clip2冒頭に足す、あるいは削るフレーム数がわかります。

stack.png

function stacksubtract (clip clip1,clip clip2,int "stack",int "f1",int "f2",int "f3"){
stack=default(stack,0)
clip1=clip1.PointResize(clip1.width/3,clip1.height/5).Letterbox(2,2,0,2)
clip2=clip2.PointResize(clip1.width,clip1.height)
r1=(defined(f1)) ? f1 : rand(clip1.framecount/3-10)+10
r2=(defined(f2)) ? f2 : rand(clip1.framecount/3)+clip1.framecount*1/3
r3=(defined(f3)) ? f3 : rand(clip1.framecount/3-300)+clip1.framecount*2/3
d1=subtract(clip1.Loop(0,0,1),clip2).subtitle("+2")
d2=subtract(clip1.Loop(0,0,0),clip2).subtitle("+1")
d3=subtract(clip1,clip2).subtitle("0")
d4=subtract(clip1,clip2.Loop(0,0,0)).subtitle("-1")
d5=subtract(clip1,clip2.Loop(0,0,1)).subtitle("-2")
blank=BlankClip(0,clip1.width,clip1.height,pixel_type="YV12")
v=(stack==2) ? StackVertical(d2,d3,d4) : StackVertical(d1,d2,d3,d4,d5)
v1=(stack==1) ? StackVertical(blank,d2,d3,d4,blank) : v
clip=StackHorizontal(v1.Trim(r1,-1),v.Trim(r2,-1),v1.Trim(r3,-1))
return clip
}

clip1,clip2 - 比較するクリップ
stack - 並べる枚数を決める 0. 全15枚を並べる/1. 四隅以外の11枚を並べる/2. 9枚を並べる
f1,f2,f3 - 行ごとに比較するフレーム番号を決める。指定なしの場合はフレーム数を3分割した後、それぞれランダムに表示する。
多局ブレンドでクリップ間に差異があるとき一方のクリップに上書きを行う - OverDiff (その3)
多局ブレンドを行う際、局独自の宣伝テロップや番組内提供など、出現フレームが毎回変わるものに対して使用します。

function OverDiff (clip clip1,clip clip2,string "filter",int "x",int "y",string "filter2",int "x2",int "y2",int "luma",bool "show",int "mode") {
x=default(x,0)
y=default(y,0)
x2=default(x2,0)
y2=default(y2,0)
luma=default(luma,133)
global luma=luma
mode=default(mode,1)
c1=(defined(filter)) ? eval("clip1."+filter) : clip1
c2=(defined(filter)) ? eval("clip2."+filter) : clip2
c2_2=(defined(filter2)) ? eval("clip2."+filter2) : c2
x2=(defined(filter2)) ? x2 : x
y2=(defined(filter2)) ? y2 : y
diff=Overlay(c1,c2,mode="difference")
clip3=(mode==0) ? Overlay(clip1,c2_2,x=x2,y=y2) : Overlay(clip1,c2,x=x,y=y)
clip3=(mode==1) ? Overlay(clip3,c2_2,x=x2,y=y2) : clip3
clip=ConditionalFilter(diff,clip1,clip3,"AverageLuma","<","luma",show=show)
return clip
}

clip1 - ベースとなるクリップ
clip2 - clip1に上書きするクリップ
filter - 双方のクリップを比較・判定しOverlayするためのcropを記述する。mode=0のときは判定のみ。
x,y - Overlayのx,y位置
filter2 - filterで上書き判定が出た際、Overlayするcropを記述する。判定には影響しない。
x2,y2 - filter2でのOverlayのx,y位置
luma - 比較クリップの差のしきい値
show - ConditionalFilterによるshowオプションを表示する
mode - 0:filterは判定のみに使用、filter2のみOverlay。1:filterとfilter2の両方をOverlayする。


使用例:

#BS11番組冒頭のテロップ
BS11=OverDiff(BS11,MX,"crop(846,940,42,20)",846,940,"crop(340,930,-340,70)",340,930,mode=0)

#BS11番組内提供と、消えるロゴの処理
BS11=OverDiff(BS11,MX,"crop(1100,580,-100,500)",1100,580,"crop(1670,40,150,80)",1670,40)
BS11=OverDiff(BS11,MX,"crop(1758,58,12,42)",1758,58,"crop(1670,40,150,80)",1670,40,mode=0)



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。