Oh, da fällt mir beim Überfliegen etwas auf:
Die SC-detection berechnet für jeden zu bearbeitendem Frame vier mal (!) das AverageLuma eines Frames. Ist wohl nicht so schlimm, weil die Frames zur Analyse auf 1/16 der Fläche reduziert werden ... aber trotzdem, einmal wäre genug. Es handelt sich ja immer um die Frames N-1, N, N+1, N+2.
Freihändig, ohne zu probieren:
Code
# msk0=ch.duplicateframe(0) .reduceby2().reduceby2() .motionmask(thsd=255,y=3,u=1,v=1)
# global msk1=msk0.trim(1,0)
# global msk2=msk0.trim(2,0)
# global msk3=msk0.trim(3,0)
global msk3 = ch.reduceby2().reduceby2() .motionmask(thsd=255,y=3,u=1,v=1).trim(2,0)
global a0 = 0.0
global a1 = 0.0
global a2 = 0.0
global a3 = 0.0
f0 = scriptclip(ch,"""sc""") #.subtitle(string(a0)+" "+string(a1)+" "+string(a2))""")
f1 = f0.frameevaluate("""sc= (sc2 || sc1) ? ch : mv""")
f2 = f1.frameevaluate("""sc2=( (a2 > (a1*5+25)) && (a2 > (a3*5+25)) ) ? true : false""")
f3 = f2.frameevaluate("""sc1=( (a1 > (a0*5+25)) && (a1 > (a2*5+25)) ) ? true : false""")
f4 = f3.frameevaluate("a3=averageluma(msk3)")
# f5= f4.frameevaluate("a2=averageluma(msk2)")
# f6= f5.frameevaluate("a1=averageluma(msk1)")
# f6. frameevaluate("a0=averageluma(msk0)")
f5 = f4.frameevaluate("a2=a3")
f6 = f5.frameevaluate("a1=a2")
f6.frameevaluate("a0=a1")
Alles anzeigen
Achtung, scharfi: das ist nur der entsprechende Ausschnitt des Scripts!
Nachteil wäre, dass ganz am Anfang während der ersten 2 bis drei Frames keine Scenechanges erkannt werden. Kann man in der Praxis wohl meistens verschmerzen.