so, ich hab mir mal nen paar framedrops simuliert.
(freezeframe sei Dank, sind aber nur laborbedingungen, das sample muss erst die praxistauglichkeit zeigen, gunnar)
meine bisher funktionierende AVS-funktion:
benoetigt mvtools.dll 0.9.4. (hier: http://jourdan.madism.org/~manao/ )
und kerneldeint140.dll (https://localhost/www.neuron2.net )
function repairframedrop(clip i, float "threshold", bool "interlaced", bool "show")
{
function kbob(clip a)
{
th=5
ord = getparity(a) ? 1 : 0
f=a.kerneldeint(order=ord, sharp=true, twoway=false, threshold=th)
e=a.doubleweave().selectodd().kerneldeint(order=1-ord, sharp=true, twoway=false, threshold=th)
interleave(f,e).assumeframebased
}
# set the defaults
global dropthreshold=default(threshold,0.1)
interlaced=default(interlaced,true)
show=default(show,false)
# commands to generate the two missing fields
a=i.kbob().converttoyv12()
afwd=a.mvanalyse(isb=false)
abwd=a.mvanalyse(isb=true)
a1=a.mvinterpolate(abwd, afwd, bl=0.30, el=0.37, nb=4).selecteven()
a2=a.mvinterpolate(abwd, afwd, bl=0.63, el=0.70, nb=4).selecteven()
a3=interleave(a2,a1).converttoyuy2()
a3=a3.separatefields()
a3=getparity(i) ? a3.selectevery(4,1,2) : a3.selectevery(4,0,3)
a3=a3.weave() .trim(1,0)
# commands to generate the missing fullframe
b=i.converttoyv12()
bfwd=b.mvanalyse(isb=false)
bbwd=b.mvanalyse(isb=true)
b3=mvinterpolate(b,bbwd,bfwd,bl=0.5,el=0.5).trim(1,0).converttoyuy2()
# either replace drop with the two recreated fields or with the fullframe
c3 = interlaced ? a3 : b3
# mark replaced dropped frames
c3 = show ? c3.subtitle("drop") : c3
# detect and replace framedrops
conditionalfilter(i.converttoyv12(),c3,i,"YDifferencefromprevious","<","dropthreshold")
}
Alles anzeigen
nutzungshinweise:
- das video muss immer mit assumetff() oder assumbff() auf die richtige fieldorder geflaggt werden.
- zur zeit nur YUY2 farbraum (der faulheit wegen)
aufruf:
avisource("capture.avi")
assumetff()
repairframedrop(interlaced=true,show=false,threshold=0.1)
alle drei parameter sind ooptional
es reicht also auch repairframedrop()
dann laeuft es mit oben genannten parametern.
wenn deine quelle progressive ist, benutze interlaced=false.
wenn Du die stellen markiert bekommen meochtest, die ersetzt wurden,nutze show=true
der threshold letztendlich steuert die drop-erkennung.
0.0 erkennt KEINE drops.
bei 255.0 werden alle frames ersetzt.
normalerweise sind die dropped frames IDENTISCH mit ihrem Vorgaenger, d.h. der threshold kann sehr, sehr niedrig ausgewaehlt werden. meist kleiner als 0.01 probiers aus.
so, und nun viel spass damit. gute nacht.