Теперь нужно составить файл команд, куда сдвигать кадры в соответствии с их номерами.
Это иной подход, зато номера кадров не "съезжают" из-за поэтапного применения функции вырезания дублей.
В данном случае файл такой:
delta.txt wrote:Type int
Default 0
R 3 6 100
7 50
13 -50
R 14 21 -100
R 27 31 100
32 50
37 -50
R 38 46 -100
R 51 52 100
читается так: для кадров 3 - 6 берем кадр из будущего (смещение +100)
для кадра 7 - берем кадр со смещением +50, т.е. интерполяцией между текущим и следующим.
и так далее. Формат файла см. там: ConditionalReader
Ну и сам скрипт с применением функции ConditionalReader.
ImageSource("img%02d.jpg", start=00, end=52)
ConvertToYV12()
myGPU = true
myErrSize = 20
super_params = (myGPU==true) ? "{gpu:1}" : "{gpu:0}"
analyse_params="{main:{search:{coarse:{distance:4,bad:{sad:2000}},type:2,distance:4},penalty:{lambda:1,pglobal:10000}},refine:[{thsad:65000}]}"
smoothfps_params="{rate:{num:2,den:1},algo:13,scene:{blend:true}}"
super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(super, vectors, smoothfps_params, mt=GetMTMode(true), url="www.svp-team.com")
global fix50 = fix_all.SelectEvery(2,1).Subtitle("fix50", align=3, size=myErrSize)
global fix50n = fix_all.SelectEvery(2,1).Subtitle("-fix50", align=3, size=myErrSize)
ScriptClip("ReplaceFrames(last,delta)")
ScriptClip("Subtitle(String(delta))")
ConditionalReader("delta.txt", "delta", false)
function ReplaceFrames(clip input, int delta)
{
(delta==-100) ? input.trim(1,1)+input : \
(delta==-50) ? fix50n.trim(1,1)+fix50n : \
(delta==50) ? fix50 : \
(delta==100) ? input.trim(1,0) : \
input
return last
}
Результат приложил. Это 52 кадра в архиве.