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

フィールドの選択 or Mergeを自動で (その8)
ノイズのマスクをMasktoolsのCombMaskに変更しました。
回りくどい処理がシンプルになったので、多少軽くなったかもしれません。

CombMask.dllを使おうかと思いましたがAvisynth2.6用のフィルタだったので保留。


function FlexibleMerge (clip clip1,clip clip2,int "level",int "level2",int "mode",int "x",int "y",int "thr",int "show") {
function Combcheck (clip clip) {clip.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()}
thr=default(thr,10)
level=default(level,128)
level2=default(level2,230)
mode=default(mode,0)
cx=default(x,0)
cy=default(y,0)
show=default(show,0)
clip2=(mode==0) ? clip2 : Overlay(clip1,clip2,x=cx,y=cy)

Mask1=CombMask(clip1, thY1 = thr, thY2 = thr)
Mask2=CombMask(clip2, thY1 = thr, thY2 = thr)
mask3=invert(mask2).Grayscale().ConvertToRGB32()#2がきれい
mask4=Logic(mask2,mask1,mode="andn").Grayscale().ConvertToRGB32()#1にノイズ、2はきれい

CleanMask=Mask(clip2.ConvertToRGB32("Rec709"),Mask3)
NoiseMask=Mask(clip2.ConvertToRGB32("Rec709"),Mask4)
clip=layer(clip1.ConvertToRGB32("Rec709"),CleanMask,op="add",level=level)
clip=layer(clip,NoiseMask,op="add",level=level2)
clip=(show==0) ? clip.ConvertToYV12(matrix="Rec709") :
\(show==1) ? Combcheck(clip) : StackHorizontal(Combcheck(clip1),Combcheck(clip2)).ReduceBy2.StackVertical(ReduceBy2(Combcheck(clip)).AddBorders(clip.width/4,0,clip.width/4,0))
return clip
}
スポンサーサイト
フィールドの選択 or Mergeを自動で (その7)
function FlexibleMerge (clip clip1,clip clip2,int "level",int "level2",int "mode",int "x",int "y",int "thr",int "show")
同内容のclip1とclip2をブレンドする際、ノイズの検出箇所にマスクをかけて限定的にブレンドを行う関数です。

0_20141128121912c9e.png


clip1 - ベースのクリップです。
clip2 - clip1に重ねるクリップです。
level - clip1とclip2の両方にノイズが無い部分と両方にノイズが出ている部分に対してのオプションです。clip2をどの程度反映させるかを指定します。[default=128,min=0,max=256]
level2 - clip1にノイズがあり、clip2にノイズが無い部分に対してのオプションです。clip2をどの程度反映させるかを指定します。[default=230,min=0,max=256]
mode - clip1とclip2の大きさが違う場合や、座標指定を行う場合は1を指定してください。Overlayフィルタを用いて座標を固定します。
x,y - clip1に対するclip2の座標です。
thr - Anticombのpass1を指定します。小さいほどコーミングを検知しやすくなります。[default=16]
show - 0は通常の出力です。1は出力フレームに対してのコーミングチェックの結果を、2はclip1,clip2,出力フレームのコーミングチェック結果を並べて表示します。


function FlexibleMerge (clip clip1,clip clip2,int "level",int "level2",int "mode",int "x",int "y",int "thr",int "show") {
function Combcheck (clip clip,int "thr") {clip.ConvertToYUY2().anticomb(checkmode=true, pass1=thr).ConvertToYV12()}
thr=default(thr,16)
level=default(level,128)
level2=default(level2,230)
mode=default(mode,0)
cx=default(x,0)
cy=default(y,0)
show=default(show,0)
clip2=(mode==0) ? clip2 : Overlay(clip1,clip2,x=cx,y=cy)

n1=clip1.Grayscale()
nV1=Combcheck(n1,thr)
diff1=Overlay(n1, nV1, mode="difference").ConvertToRGB32()
Mask1=Colorkeymask(diff1,$828282,0).showalpha()
n2=clip2.Grayscale()
nV2=Combcheck(n2,thr)
diff2=Overlay(n2, nV2, mode="difference").ConvertToRGB32()
Mask2=Colorkeymask(diff2,$828282,0).showalpha()

MaskAdd1=Layer(Mask1.Levels(0, 1, 255, 255, 0),Mask2,op="subtract")#Mask1にノイズなし、Mask2にノイズなし
MaskAdd2=Layer(Mask1,Mask2,op="darken")#Mask1にノイズあり、Mask2にノイズあり
MaskAdd=Layer(MaskAdd1,MaskAdd2,op="lighten")#ありあり+なしなし
MaskSub=Layer(Mask1,Mask2,op="subtract")#Mask1にノイズあり、Mask2にノイズなし
CleanMask=Mask(clip2.ConvertToRGB32("Rec709"),MaskAdd)
NoiseMask=Mask(clip2.ConvertToRGB32("Rec709"),MaskSub)
clip=layer(clip1.ConvertToRGB32("Rec709"),CleanMask,op="add",level=level)
clip=layer(clip.ConvertToRGB32("Rec709"),NoiseMask,op="add",level=level2)
clip=(show==0) ? clip.ConvertToYV12(matrix="Rec709") :
\(show==1) ? Combcheck(clip,thr) : StackHorizontal(Combcheck(clip1,thr),Combcheck(clip2,thr)).ReduceBy2.StackVertical(ReduceBy2(Combcheck(clip,thr)).AddBorders(clip.width/4,0,clip.width/4,0))
return clip
}
フィールドの選択 or Mergeを自動で (その6)
function VariableMerge (clip clip_1,clip clip_2,int "cx",int "cy",int "mode",int "thr",int "show")

clip_1とclip_2をブレンドする際、2つのクリップのノイズ(コーミング)の量に応じてMergeのweightを変化させる関数です。
ここで使用するclip_1とclip_2は同じ内容のクリップであることが前提条件です。

28338a.png

clip_1 - ベースのクリップです。
clip_2 - clip_1にブレンドするクリップです。
cx,cy - clip_2の座標を指定します。これを指定すると関数内でMergeの代わりにOverlayが適用されます。
mode - 指定なしではMergeを、1を指定するとOverlayを使用します。
thr - Anticomb内のpass1を指定します。小さいほどコーミングを検知しやすくなります。[default 16]
show - 1でclip_1,clip_2,出力クリップの比較を、2でclip_1,clip_2に番号を表示します。[default 0]

function VariableMerge (clip clip_1,clip clip_2,int "cx",int "cy",int "mode",int "thr",int "show") {
cx=default(cx,0)
cy=default(cy,0)
global cx=cx
global cy=cy
mode=default(mode,0)
thr=default(thr,16)
show=default(show,0)
global clip_1= (show==2) ? clip_1.Subtitle("1 ",size=30,align=8) : clip_1
global clip_2= (show==2) ? clip_2.Subtitle(" 2",size=30,align=8) : clip_2

global clip_1V=clip_1.ConvertToYUY2().anticomb(checkmode=true, pass1=thr).ConvertToYV12()
global clip_2V=clip_2.ConvertToYUY2().anticomb(checkmode=true, pass1=thr).ConvertToYV12()

cM=ScriptClip(clip_1,"Merge(clip_1,clip_2,Abs(min(4,max(-4,(AverageChromaV(clip_1V)-AverageChromaV(clip_2V))))/10+0.5))")
cO=ScriptClip(clip_1,"Overlay(clip_1,clip_2,x=cx,y=cy,opacity=Abs(min(4,max(-4,(AverageChromaV(clip_1V)-AverageChromaV(clip_2V))))/10+0.5))")
clip=(cx==0)&&(cy==0)&&(mode==0) ? cM : cO

global MV=clip.ConvertToYUY2().anticomb(checkmode=true, pass1=thr).ConvertToYV12()
clip=(show==1) ? StackHorizontal(clip_1V,clip_2V).ReduceBy2.StackVertical(ReduceBy2(MV).AddBorders(clip.width/4,0,clip.width/4,0)).
\ScriptClip("""subtitle(string(AverageChromaV(clip_1V)-128)+" , "+string(AverageChromaV(clip_1V)-AverageChromaV(clip_2V))+" , "+string(AverageChromaV(clip_2V)-128),align=8)
\.subtitle(string(AverageChromaV(MV)-128),align=8,y=30)
\.subtitle("Merge Weight = "+string(Abs(min(4,max(-4,(AverageChromaV(clip_1V)-AverageChromaV(clip_2V))))/10+0.5)),align=8,y=60)""")
\ : clip

return clip
}


いろいろと試行錯誤して、かなり良い感じになってきました。
global変数の使い方が不安です。2回以上呼び出す場合は、その都度変数名を変える必要があります…。

Itsを使用したクリップを掛け合わせる場合は以下のように書くのがいいかと思います。
[def]
Set [24] DW023='DW023'
Set [24] DW013='DW013'
Set [24] DW134='DW134'
Set [24] DW124='DW124'
Set [24] DW024='DW024'

[avs]
LoadPlugin("Its1.dll")
DW023=DoubleWeave().SelectEvery(5, 0, 2)
DW013=DoubleWeave().SelectEvery(5, 0, 3)
DW134=DoubleWeave().SelectEvery(5, 1, 3)
DW124=DoubleWeave().SelectEvery(5, 1, 4)
DW024=DoubleWeave().SelectEvery(5, 2, 4)
V1=Its(def = "time.def", fps=-1, output = "datafile\timecode.tmc")

LoadPlugin("Its2.dll")
DW023=DoubleWeave().SelectEvery(5, 0, 3)
DW013=DoubleWeave().SelectEvery(5, 1, 3)
DW134=DoubleWeave().SelectEvery(5, 1, 4)
DW124=DoubleWeave().SelectEvery(5, 2, 4)
DW024=DoubleWeave().SelectEvery(5, 2, 5)
V2=Its(def = "time.def", fps=-1, output = "datafile\timecode.tmc")

VariableMerge(V1,V2)
フィールドの選択 or Mergeを自動で (その5)
function VariableMerge

汚いフィールドを捨てるよりも、少しだけブレンドしたほうが良い結果が出たので
MergeフィルタのWeightを自動で調整する関数を作りました。

…結構うまいことできたと思ったんですが、Itsで使うとグローバル変数+条件フィルタから呼び出したフレームがズレてしまう事がわかったので、自分の環境では使えませんでした。
どうすれば…



function VariableMerge (clip clip,int step,int f1,int f2,int "show") {
show=default(show,0)

global f1c= (show==2) ? clip.SelectEvery(step,f1).Subtitle("1 ",size=30,align=8) : clip.SelectEvery(step,f1)
global f2c= (show==2) ? clip.SelectEvery(step,f2).Subtitle(" 2",size=30,align=8) : clip.SelectEvery(step,f2)

global f1V=f1c.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global f2V=f2c.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()

clip= ScriptClip(f1c,"Merge(f1c,f2c,Abs(min(4,max(-4,(AverageChromaV(f1V)-AverageChromaV(f2V))))/10+0.5))")

global MV=clip.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()

clip=(show==1) ? StackHorizontal(f1V,f2V).ReduceBy2.StackVertical(ReduceBy2(MV).AddBorders(clip.width/4,0,clip.width/4,0)).\
ScriptClip("""subtitle(string(AverageChromaV(f1V)-128)+" , "+string(AverageChromaV(f1V)-AverageChromaV(f2V))+" , "+string(AverageChromaV(f2V)-128),align=8)""").\
ScriptClip("""subtitle(string(AverageChromaV(MV)-128),align=8,y=30)""").\
ScriptClip("""subtitle("Merge Weight = "+string(Abs(min(4,max(-4,(AverageChromaV(f1V)-AverageChromaV(f2V))))/10+0.5)),align=8,y=60)""") : clip

return clip
}
フィールドの選択 or Mergeを自動で (その4)
※Itsで使うと、条件フィルタ内のグローバル変数が前のフレーム?を呼び出してしまうようなので上手く動きません。
どうすればいいのかわからず、お手上げ状態です。


function GetBetterFrame

SelectEveryで選んだ2つのフレームから良いフレームを出力する関数です。
双方のノイズ量に大差がなければブレンドを行います。

前のは設定を固めすぎて2224プルダウンに使えなかったので、不要な部分を削って必要な機能に絞りました。
DoubleWeave().SelectEvery(5,1,3) or DoubleWeave().SelectEvery(5,1,4)
であれば以下のように書きます。
Interleave(DoubleWeave().SelectEvery(5,1),DoubleWeave().GetBetterFrame(5,3,4))


function GetBetterFrame (clip clip,int step,int f1,int f2,float "thr",int "show") {
show=default(show,0)
global thr=default(thr,1.0)

f1c=clip.SelectEvery(step,f1)
f2c=clip.SelectEvery(step,f2)

global f1V=f1c.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global f2V=f2c.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()

f1c=(show==2) ? f1c.Subtitle("1 ",size=30,align=8) : f1c
f2c=(show==2) ? f2c.Subtitle(" 2",size=30,align=8) : f2c

M=Merge(f1c,f2c)
S=ConditionalFilter(clip,f1c,f2c,"AverageChromaV(f1V)","<","AverageChromaV(f2V)")

clip=ConditionalFilter(clip,M,S,"Abs(AverageChromaV(f1V)-AverageChromaV(f2V))","<","thr")

clip=(show==1) ? StackHorizontal(Histogram(f1c,mode="luma"),Histogram(f2c,mode="luma")).HorizontalReduceBy2.\
ScriptClip("""subtitle(string(AverageChromaV(f1V))+" : "+string(AverageChromaV(f2V)),align=8)""") : clip
return clip
}
フィールドの選択 or Mergeを自動で (その3)
※また誤記…。
v1=ConditionalFilter(clip,v1M,v1S,"AverageChromaV(v1aV)-AverageChromaV(v1bV)","<","1.0")
v2=ConditionalFilter(clip,v2M,v2S,"AverageChromaV(v2aV)-AverageChromaV(v2bV)","<","1.0")

v1=ConditionalFilter(clip,v1M,v1S,"Abs(AverageChromaV(v1aV)-AverageChromaV(v1bV))","<","1.0")
v2=ConditionalFilter(clip,v2M,v2S,"Abs(AverageChromaV(v2aV)-AverageChromaV(v2bV))","<","1.0")


やりたい事は概ね出来た感じです。
show=0,1,2
1と2でフレームの状態確認ができます。1はHistogramで強調したクリップを左右に並べる、2はどちらのフィールドを選んだか、またはブレンドしたかを表示する事ができます。

function FindField (clip clip,int F1,int F2,int S1,int S2,int "show") {
show=default(show,0)
v1a=((F2-F1)<2) ? clip.DoubleWeave().SelectEvery(5, F1) : clip.DoubleWeave().SelectEvery(10, F1,F1+5)
v1b=((F2-F1)<2) ? clip.DoubleWeave().SelectEvery(5, F2) : clip.DoubleWeave().SelectEvery(10, F1,F2)
v2a=clip.DoubleWeave().SelectEvery(5, S1)
v2b=clip.DoubleWeave().SelectEvery(5, S2)

global v1aV=v1a.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v1bV=v1b.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v2aV=v2a.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v2bV=v2b.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()

v1a=(show==2) ? v1a.Subtitle("1 ",size=30,align=8) : v1a
v1b=(show==2) ? v1b.Subtitle(" 2",size=30,align=8) : v1b
v2a=(show==2) ? v2a.Subtitle("1 ",size=30,align=8) : v2a
v2b=(show==2) ? v2b.Subtitle(" 2",size=30,align=8) : v2b

v1M=Merge(v1a,v1b)
v2M=Merge(v2a,v2b)
v1S=ConditionalFilter(clip,v1a,v1b,"AverageChromaV(v1aV)","<","AverageChromaV(v1bV)")
v2S=ConditionalFilter(clip,v2a,v2b,"AverageChromaV(v2aV)","<","AverageChromaV(v2bV)")

v1=ConditionalFilter(clip,v1M,v1S,"Abs(AverageChromaV(v1aV)-AverageChromaV(v1bV))","<","1.0")
v2=ConditionalFilter(clip,v2M,v2S,"Abs(AverageChromaV(v2aV)-AverageChromaV(v2bV))","<","1.0")

v1=(F1==F2) ? v1a : v1
v2=(S1==S2) ? v2a : v2

v1=(show==1) ? StackHorizontal(Histogram(v1a,mode="luma"),Histogram(v1b,mode="luma")).HorizontalReduceBy2.\
ScriptClip("""subtitle(string(AverageChromaV(v1aV))+" : "+string(AverageChromaV(v1bV)),align=8)""") : v1
v2=(show==1) ? StackHorizontal(Histogram(v2a,mode="luma"),Histogram(v2b,mode="luma")).HorizontalReduceBy2.\
ScriptClip("""subtitle(string(AverageChromaV(v2aV))+" : "+string(AverageChromaV(v2bV)),align=8)""") : v2
clip=Interleave(v1,v2)
return clip
}
フィールドの選択 or Mergeを自動で (その2)
※誤字を訂正。

前のがややこしかったので使う気が起こらず、作り直しました。
avsに貼り付けたりする部分を統合。

DoubleWeave().SelectEvery(5, 0, 2) または DoubleWeave().SelectEvery(5, 0, 3)
で間引くところを
FindField(last,0,0,2,3,false)
と記述します。
F1とF2,S1とS2がそれぞれDoubleWeave().SelectEvery(5, F, S)となり、
ノイズの量に応じてどちらかを選択し、ノイズが少ない場合はブレンドします。


function FindField (clip clip,int F1,int F2,int S1,int S2,bool "show") {
show=default(show,false)
v1f1=((F2-F1)<2) ? clip.DoubleWeave().SelectEvery(5, F1) : clip.DoubleWeave().SelectEvery(10, F1,F1+5)
v1f2=((F2-F1)<2) ? clip.DoubleWeave().SelectEvery(5, F2) : clip.DoubleWeave().SelectEvery(10, F1,F2)
v2f1=clip.DoubleWeave().SelectEvery(5, S1)
v2f2=clip.DoubleWeave().SelectEvery(5, S2)
global v1f1_combed=v1f1.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v1f2_combed=v1f2.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v2f1_combed=v2f1.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v2f2_combed=v2f2.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
CF1=ConditionalFilter(clip,v1f1,v1f2,"v1f1_combed.AverageChromaV()","<","v1f2_combed.AverageChromaV()",show)
CF2=ConditionalFilter(clip,v2f1,v2f2,"v2f1_combed.AverageChromaV()","<","v2f2_combed.AverageChromaV()",show)
v1Merge=(show) ? Merge(v1f1,v1f2).subtitle("Merge") : Merge(v1f1,v1f2)
v2Merge=(show) ? Merge(v2f1,v2f2).subtitle("Merge") : Merge(v2f1,v2f2)
v1=(F1==F2) ? v1f1 : ConditionalFilter(clip,CF1,v1Merge,"Abs(v1f1_combed.AverageChromaV()-v1f2_combed.AverageChromaV())",">","1.0")
v2=(S1==S2) ? v2f1 : ConditionalFilter(clip,CF2,v2Merge,"Abs(v2f1_combed.AverageChromaV()-v2f2_combed.AverageChromaV())",">","1.0")
c=Interleave(v1,v2)
return c
}
フィールドの選択 or Mergeを自動で
だいぶめんどくさい事になりましたが、一応やりたいことは出来ました。
もう少し書き方を整理したいです。


・defファイル内の設定
Set [24] DW023='Interleave(DW023a,DW023b)'
Set [24] DW013='Interleave(DW013a,DW013b)'
Set [24] DW134='Interleave(DW134a,DW134b)'
Set [24] DW124='Interleave(DW124a,DW124b)'
Set [24] DW024='Interleave(DW024a,DW024b)'

・avs
DW023a=DoubleWeave().SelectEvery(5, 0)
DW023b=FieldMS(DoubleWeave().SelectEvery(5, 2),DoubleWeave().SelectEvery(5, 3),false)
DW013a=FieldMS(DoubleWeave().SelectEvery(5, 0),DoubleWeave().SelectEvery(5, 1),false)
DW013b=DoubleWeave().SelectEvery(5, 3)
DW134a=DoubleWeave().SelectEvery(5, 1)
DW134b=FieldMS(DoubleWeave().SelectEvery(5, 3),DoubleWeave().SelectEvery(5, 4),false)
DW124a=DoubleWeave().SelectEvery(5, 1, 4)
DW124b=DoubleWeave().SelectEvery(5, 2, 4)
DW124a=FieldMS(DoubleWeave().SelectEvery(5, 1),DoubleWeave().SelectEvery(5, 2),false)
DW124b=DoubleWeave().SelectEvery(5, 4)
DW024a=FieldMS(DoubleWeave().SelectEvery(10, 0, 5),DoubleWeave().SelectEvery(10, 0, 4),false)
DW024b=DoubleWeave().SelectEvery(10, 2, 7)

Its(video,def = "time1.def", fps=-1, output = "datafile\timecode.tmc")

return last
function FieldMS (clip v1,clip v2,bool show) {
global v1_combed=v1.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
global v2_combed=v2.ConvertToYUY2().anticomb(checkmode=true, pass1=16).ConvertToYV12()
v1=(show) ? v1.subtitle("v1") : v1
v2=(show) ? v2.subtitle("v2") : v2
v12=(show) ? Merge(v1,v2).subtitle("v12") : Merge(v1,v2)
CF1=ConditionalFilter(v1,v1,v2,"v1_combed.AverageChromaV()","<","v2_combed.AverageChromaV()",false)
ConditionalFilter(v1,CF1,v12,"ChromaVDifference(v1_combed,v2_combed)",">","1.0",show)
}
フィールド選択とブレンド
potatosubさんのやっていることが気になってしまったので、
似たような事をやってみました。途中経過ですが。

クリップボード01

クリップボード02
↑のような2フレームを比較して片方をとったりMergeします。
ただ、ノイズの検出方法が悩ましいです。コーミングで判断するのが良いようですが、Mergeしたほうがマシになるような微妙なフレームもあり。うーん。
MVTools2による30p→24p化 (MBlockFps)
※追記
実際に使ってみたのを動画で見てみたらイマイチでした。
画面の動きが早いOPはごまかせるものの、画面がゆっくり流れるシーンではチラつきが出るし
EDは文字が出るフレームがグニャっとなるので気になってしょうがない。
ただのスクロールなら、設定を変えれば気にならないレベルまでいけそうですが
テロップの入出はフレーム補間では難しい気がします。
テロップに関しては次フレームとのdiff値で補間フレームを切り捨てられれば、あるいは。
いや無理か。
既存の関数だとどうなってるんだろうなあ。



画面がスクロールするカットのみ謎のインターレースが生まれるマジンボーンで使う関数です。
30pにするのが順当な処理ですが、VFRにするほどの意味もないので24pでも良いですね。

該当するカットは画面のスクロールに口パクがある程度なので、簡単な処理でも破綻が生まれにくいです。
なお、スクロール以外はブロックノイズだらけになります。


Function c30to24 (clip last)
{
yadif(Mode=0)
s=MSuper (pel=1,hpad=0,vpad=0,chroma=true)
b=MAnalyse (s,isb = true, chroma=false,blksize=16)
f=MAnalyse (s,isb = false, chroma=false,blksize=16)
b2=MRecalculate (s,b, chroma=false,blksize=8)
f2=MRecalculate (s,f, chroma=false,blksize=8)
MBlockFps(s,b2,f2,num=24000,den=1001)
}
多局ブレンドとフィールドのブレンド
DupMC2Defをつかった方法
・多局ブレンド
ブレンドするだけならMergeで良いですが、地上波ではBSとくらべて両サイドが数pxカットされていたりするので、位置調整を考えるとOverlayの方が便利です。

クリップボード01
こんな感じで開始フレームの位置をあわせます。

1フレームだけでは合っているか判断がつかないので、数フレーム同時に見えるようにしています。
以下の関数。表示するフレームの数を調節できたら便利かもしれないですが、面倒なのでそこまでやりません。patternは1か2。
showsubtract(last,V1,V2,1)

function showsubtract (clip clip,clip clip1,clip clip2,int pattern){
d1=Subtract(clip1,clip2).Trim(clip.framecount/10*(pattern),-1)
d1fc=string(clip.framecount/10*(pattern))
d2=Subtract(clip1,clip2).Trim(clip.framecount/10*(pattern+2),-1)
d2fc=string(clip.framecount/10*(pattern+2))
d3=Subtract(clip1,clip2).Trim(clip.framecount/10*(pattern+4),-1)
d3fc=string(clip.framecount/10*(pattern+4))
d4=Subtract(clip1,clip2).Trim(clip.framecount/10*(pattern+6),-1)
d4fc=string(clip.framecount/10*(pattern+6))
d5=Subtract(clip1,clip2).Trim(clip.framecount/10*(pattern+8),-1)
d5fc=string(clip.framecount/10*(pattern+8))
diff=StackHorizontal(d1,d2,d3,d4,d5).PointResize(clip.width,clip.height/5)
StackVertical(diff,clip).subtitle(d1fc).subtitle(d2fc,x=clip.width/5).subtitle(d3fc,x=clip.width/5*2).subtitle(d4fc,x=clip.width/5*3).subtitle(d5fc,x=clip.width/5*4)
}

・フィールドのブレンド
重複フィールドのブレンドが有効なのは2フレーム中1フレームなので
共通のフレームとブレンドしたフレームをInterleavedで交互に使います。全部Mergeするよりも軽くなるはず。

[ini]
DW023=Interleave(DW023a,DW023b)
DW013=Interleave(DW013a,DW013b)
DW134=Interleave(DW134a,DW134b)
DW124=Interleave(DW124a,DW124b)
DW024=Interleave(DW024a,DW024b)

[avs]
DW023a=DoubleWeave().SelectEvery(5, 0)
DW023b=Merge(DoubleWeave().SelectEvery(5, 2),DoubleWeave().SelectEvery(5, 3))
DW013a=Merge(DoubleWeave().SelectEvery(5, 0),DoubleWeave().SelectEvery(5, 1))
DW013b=DoubleWeave().SelectEvery(5, 3)
DW134a=DoubleWeave().SelectEvery(5, 1)
DW134b=Merge(DoubleWeave().SelectEvery(5, 3),DoubleWeave().SelectEvery(5, 4))
DW124a=DoubleWeave().SelectEvery(5, 1, 4)
DW124b=DoubleWeave().SelectEvery(5, 2, 4)
DW124a=Merge(DoubleWeave().SelectEvery(5, 1),DoubleWeave().SelectEvery(5, 2))
DW124b=DoubleWeave().SelectEvery(5, 4)
DW024a=Merge(DoubleWeave().SelectEvery(10, 0, 5),DoubleWeave().SelectEvery(10, 0, 4))
DW024b=DoubleWeave().SelectEvery(10, 2, 7)
Its(def = "time.def", fps=-1, output = "datafile\timecode.tmc")




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