На просторах интернета нашёл еще один скрипт, лечащий фиксы. Работает быстрее чем GameDropFix - на i3570k@4.7ghz выдает в районе 100fps с включённой многоядерностью Avisynth, но сравнить его эффективность с GameDropFix_v4 я не могу.

super=MSuper(last,pel=2)
vfe=manalyse(super,truemotion=true,isb=false,delta=1)
vbe=manalyse(super,truemotion=true,isb=true,delta=1)
filldrops = mflowinter(last,super,vbe,vfe,time=50)
ConditionalFilter(last, filldrops, last, "YDifferenceFromPrevious()", "lessthan", "0.1")

Мне интересно как работает логика лечения дропнутых кадров на видео с переменным FPS. У меня телефон снимает видео с плавающим FPS, особенно в темноте FPS падает. Но если FPS не постоянный, то к какому FPS скрипт дропфикса приводит видео? На что ориентируется? например если FPS скачет от 29 до 16, до какого FPS DropFix синтезирует промежуточные кадры во время 16fps ного участка ? или это выполняет AssumeFPS? а дропфикс уже после AssumeFPS на входе уже имеет ConstantFPS и смотрит что там наделал этот AssumeFPS?

Я пытаюсь выработать универсальную стратегию обработки видео.
- Сначала стабилизирую с помощью pdoDAD Mercalli
- затем удаляю шумы каким-то скриптом из интернета

b = FluxSmoothST(3)
SeeSaw(last,b,NRlimit=2, NRlimit2=1, Sstr=1.4, Slimit=7, Spower=2, Sdamplo=8, SdampHi=10, Szp=10, bias=1, sootheT=30)

- затем прогоняю DropFix'ом
- и затем спомощью SVP делаю видео с нужным фпс - обычно это 60FPS, чтобы плавнее смотрелось InterFrame(Cores=4,GPU=false,NewNum=60,NewDen=1)

У меня тоже не получается приделать GameDropFix_v4 в качестве шаблона в MeGui.

В самом MeGui в AviSynth configuration dialog -> Template скрипт такой

Setmemorymax(512)
SetMTMode(3,4)
PluginPath = "E:\videowork\MeGUI 2507 x86\tools\avisynth_plugin\"
LoadPlugin(PluginPath+"svpflow1.dll")
LoadPlugin(PluginPath+"svpflow2.dll")
LoadPlugin(PluginPath+"mt_masktools-26.dll")
Import(PluginPath+"GameDropFix_v4.avsi")
<input>.ConvertToYV12()
<deinterlace>
<crop>
<denoise>
<resize>
DropFix(<input>,Threads=4)

Само тело скрипта я положил в файл GameDropFix_v4.avsi   в нём всё запихнул в функцию DropFix.

Чтобы заработал, я поменял только вначале Width на Input.Width и в конце заменил вызов ScriptClip к текущему контексту на такой вызов:

out = Input.ScriptClip(".....")
o = out.trim(0,Input.framecount-10)
o

function DropFix(clip Input, int "Threads")
{
src=last
super_params_mini="{scale:{up:0},gpu:1}"
analyse_params_mini="{block:{w:8,h:8}}"
miniW = int(Input.width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(Input.height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(Input,miniW,miniH).TemporalSoften(1, 1, 0, scenechange=1, mode=2)
super_mini=mini.SVSuper(super_params_mini)
vectors_mini=SVAnalyse(super_mini, analyse_params_mini)
vectors_Forward=SVConvert(vectors_mini, false)
HorizontalSpeed_luma=mini.MMask(vectors_Forward, kind=3).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)
VerticalSpeed_luma=mini.MMask(vectors_Forward, kind=4).convertToRGB32().PointResize(miniW/8, miniH/8).PointResize(miniW/4, miniH/4).ConvertToYV12().mt_lut(y=2, u=128, v=128)

size=16
luma_lft=HorizontalSpeed_luma.crop(0,0,miniW/16,0).BicubicResize(size,size)
luma_rgh=HorizontalSpeed_luma.crop(miniW/16+miniW/8,0,0,0).BicubicResize(size,size)
luma_top=VerticalSpeed_luma.crop(0,0,0,miniH/16).BicubicResize(size,size)
luma_btm=VerticalSpeed_luma.crop(0,miniH/16+miniH/8,0,0).BicubicResize(size,size)
luma_drop=luma_lft.mt_lut(y=-1, u=128, v=128)

move_idx=5
y_idx=3
min_move=0.2
max_stop=0.5
drop_clip=luma_drop.ScriptClip("
    AvgLuma_lft=128-luma_lft.AverageLuma
    AvgLuma_rgh=128-luma_rgh.AverageLuma
    AvgLuma_lft_prev=128-(luma_lft.trim(1,1)+luma_lft).AverageLuma
    AvgLuma_rgh_prev=128-(luma_rgh.trim(1,1)+luma_rgh).AverageLuma
    AvgLuma_lft_next=128-luma_lft.trim(1,0).AverageLuma
    AvgLuma_rgh_next=128-luma_rgh.trim(1,0).AverageLuma

    AvgLuma_top=128-luma_top.AverageLuma
    AvgLuma_btm=128-luma_btm.AverageLuma
    AvgLuma_top_prev=128-(luma_top.trim(1,1)+luma_top).AverageLuma
    AvgLuma_btm_prev=128-(luma_btm.trim(1,1)+luma_btm).AverageLuma
    AvgLuma_top_next=128-luma_top.trim(1,0).AverageLuma
    AvgLuma_btm_next=128-luma_btm.trim(1,0).AverageLuma

    Max_lft=max(abs(AvgLuma_lft_prev),abs(AvgLuma_lft),abs(AvgLuma_lft_next))
    Max_rgh=max(abs(AvgLuma_rgh_prev),abs(AvgLuma_rgh),abs(AvgLuma_rgh_next))
    Max_top=max(abs(AvgLuma_top_prev),abs(AvgLuma_top),abs(AvgLuma_top_next))
    Max_btm=max(abs(AvgLuma_btm_prev),abs(AvgLuma_btm),abs(AvgLuma_btm_next))
    Max_all=max(Max_lft,Max_rgh,Max_top,Max_btm)
    
    MaxLuma=max(abs(AvgLuma_lft),abs(AvgLuma_rgh),abs(AvgLuma_top),abs(AvgLuma_btm))
    MaxLuma_prev=max(abs(AvgLuma_lft_prev),abs(AvgLuma_rgh_prev),abs(AvgLuma_top_prev),abs(AvgLuma_btm_prev))
    MaxLuma_next=max(abs(AvgLuma_lft_next),abs(AvgLuma_rgh_next),abs(AvgLuma_top_next),abs(AvgLuma_btm_next))
    dif=mini.YDifferenceFromPrevious
    dif_next=mini.trim(1,0).YDifferenceFromPrevious
    dif_prev=(mini.trim(1,1)+mini).YDifferenceFromPrevious
    
    GoodContrast = (max(mini.YPlaneMinMaxDifference,mini.trim(1,0).YPlaneMinMaxDifference)>20) ? 1 : 0

    drop = (MaxLuma<0.1 && MaxLuma*2<Max(MaxLuma_prev,MaxLuma_next) && dif*y_idx<max(dif_prev,dif_next)) ? 1 : 0

    drop_lft = (AvgLuma_lft_prev*AvgLuma_lft_next>0 && abs(AvgLuma_lft*move_idx)<Max_lft && abs(AvgLuma_lft)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 2 : 0
    drop_rgh = (AvgLuma_rgh_prev*AvgLuma_rgh_next>0 && abs(AvgLuma_rgh*move_idx)<Max_rgh && abs(AvgLuma_rgh)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 3 : 0
    drop_top = (AvgLuma_top_prev*AvgLuma_top_next>0 && abs(AvgLuma_top*move_idx)<Max_top && abs(AvgLuma_top)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 4 : 0
    drop_btm = (AvgLuma_btm_prev*AvgLuma_btm_next>0 && abs(AvgLuma_btm*move_idx)<Max_btm && abs(AvgLuma_btm)<=min_move && dif*y_idx<max(dif_prev,dif_next)) ? 5 : 0
   
    drop = (drop==0 && MaxLuma<Max_stop && Max_lft==Max_all) ? drop_lft : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_rgh==Max_all) ? drop_rgh : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_top==Max_all) ? drop_top : drop
    drop = (drop==0 && MaxLuma<Max_stop && Max_btm==Max_all) ? drop_btm : drop
    drop_dif = (dif<0.4 && MaxLuma<min_move) ? 6 : 0
    drop = (drop==0 && drop_dif>0) ? drop_dif : drop
    drop = (drop>0 && Max_all<0.2) ? 0 : drop
    drop = (drop>0 && GoodContrast==0) ? 0 : drop

    luma=mini.AverageLuma
    luma_next=mini.trim(1,0).AverageLuma
    max_luma=max(luma,luma_next)

    drop = (drop>0 && max_luma<16.5) ? 0 : drop

    (drop>0) ? luma_drop : \
     (Max_lft==Max_all) ? luma_lft : \
      (Max_rgh==Max_all) ? luma_rgh : \
       (Max_top==Max_all) ? luma_top : luma_btm
")

fix_r50=luma_lft.mt_lut(y=-1, u=128, v=128)
fix_lr33=luma_lft.mt_lut(y=-2, u=128, v=128)
fix_l50=luma_lft.mt_lut(y=-3, u=128, v=128)
fix_r133=luma_lft.mt_lut(y=-4, u=128, v=128)
fix_r66=luma_lft.mt_lut(y=-5, u=128, v=128)

AvgDrop=127
MaxMulty=10
dblMulti=1.3
fix_clip=luma_drop.ScriptClip("
    drop=drop_clip.AverageLuma
    AvgLuma=abs(128-drop_clip.AverageLuma)
    AvgLuma_prev=abs(128-(drop_clip.trim(1,1)+drop_clip).AverageLuma)
    AvgLuma_prev_= (AvgLuma_prev==AvgDrop) ? 0 : AvgLuma_prev
    AvgLuma_prev2=abs(128-(drop_clip.trim(1,2)+drop_clip).AverageLuma)
    AvgLuma_next=abs(128-drop_clip.trim(1,0).AverageLuma)
    AvgLuma_next_= (AvgLuma_next==AvgDrop) ? 0 : AvgLuma_next
    AvgLuma_next2=abs(128-drop_clip.trim(2,0).AverageLuma)

    RightZero = (AvgLuma_prev_*MaxMulty<AvgLuma_next_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0
    LeftZero = (AvgLuma_next_*MaxMulty<AvgLuma_prev_) ? (AvgLuma_prev_>max_stop || AvgLuma_next_>max_stop) ? 1 : 0 : 0

    drop = (AvgLuma==AvgDrop && AvgLuma_next==AvgDrop) ? -50 : 0
    drop = (AvgLuma==AvgDrop && AvgLuma_prev==AvgDrop) ? 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && RightZero==0) ? \
     AvgLuma_prev_>AvgLuma_next_*dblMulti ? -50 : \
      AvgLuma_prev_*dblMulti>=AvgLuma_next_ ? AvgLuma_next2==AvgDrop ? 50 : 33 : 50 : drop

    drop = (drop==0 && AvgLuma==AvgDrop && RightZero==0 && AvgLuma_next2==AvgDrop) ? -50 : drop
    drop = (drop==0 && AvgLuma==AvgDrop && LeftZero==0 && AvgLuma_prev2==AvgDrop) ? 66 : drop

    (drop==50) ? fix_r50 : \
     (drop==33) ? fix_lr33 : \
      (drop==-50) ? fix_l50 : \
       (drop==133) ? fix_r133 : \
        (drop==66) ? fix_r66 : drop_clip
")

r50=1
lr33=2
l50=3
r133=4
r66=5

super_params="{scale:{up:0},gpu:1}"
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:12,den:1},algo:13,scene:{blend:true}}"

super=SVSuper(Input,super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(Input, super, vectors, smoothfps_params, mt=Threads, url="www.svp-team.com")
fix50 = fix_all.SelectEvery(12,6).Subtitle("fix50", align=3, size=12)
fix33 = fix_all.SelectEvery(12,4).Subtitle("fix33", align=3, size=12)
fix66 = fix_all.SelectEvery(12,8).Subtitle("-fix33", align=3, size=12)
fix66p = fix_all.SelectEvery(12,8).Subtitle("fix66", align=3, size=12)
fix75 = fix_all.SelectEvery(12,9).Subtitle("-fix25", align=3, size=12)
fix50n = fix_all.SelectEvery(12,6).Subtitle("-fix50", align=3, size=12)
fix133 = fix_all.SelectEvery(12,4).Subtitle("fix133", align=3, size=12)
fix125 = fix_all.SelectEvery(12,3).Subtitle("fix125", align=3, size=12)

out = Input.ScriptClip("
    AvgFix=fix_clip.AverageLuma
    AvgFix_next=fix_clip.trim(1,0).AverageLuma
    AvgFix_next2=fix_clip.trim(2,0).AverageLuma
    AvgFix_next3=fix_clip.trim(3,0).AverageLuma
    AvgFix_prev=(fix_clip.trim(1,1)+fix_clip).AverageLuma

    (AvgFix==r50) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix33 : fix50 : \
    (AvgFix==lr33) ? fix33 : \
    (AvgFix_next==lr33) \
     ? (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix66.trim(1,1)+fix66 : \
    (AvgFix_next==l50) \
      ? (AvgFix_prev==lr33 || AvgFix_prev==r50) ? fix66.trim(1,1)+fix66 \
      : (AvgFix_prev==r66) ? fix75.trim(1,1)+fix75 : fix50n.trim(1,1)+fix50n : \
    (AvgFix==r66) \
      ? (AvgFix_next2==lr33 || AvgFix_next2==l50) ? fix50 : fix66p : \
    (AvgFix_next==r66) \
      ? (AvgFix_next3==lr33 || AvgFix_next3==l50) ? fix125.trim(1,0) : fix133.trim(1,0) : \
    last
    ")
o = out.trim(0,Input.framecount-10)
o
}

Скрипт съедается, но пишет вверху видео кадра  "I don't know what "fix_clip" means ([ScriptClip], line 2)
http://cs618725.vk.me/v618725838/28b2c/XiYpp1xkMcM.jpg

Почему он не видит этот fix_clip - ума приложить не могу((

Предыдущий скрипт, использующий более продвинутую MFlowBlur на моём i3570k + GTX260 отрабатывает на 13-14 fps, в сложных местах проседая до 2х фпс. То есть включение мультитрединга значительно повысило производительность, думаю, 3-14 фпс это не 3фпс, думаю, буду пользоваться всё-таки им.

И небольшое дополнение. Скрипт крэшился хаотично в библиотеках SVP и MVTools, в гугле нашел решение, и оно мне помогло, - убрать функцию Distributor() в конце скрипта, которая вроде собирает кадры в один при многозадачной обработке. Пишут, что VirtualDub делает это сам, и эта функция не нужна. Убрал её и больше не крэшит.

Вообще, конечно, приятно наблюдать, как мой недавно купленный "монстрик" i3570k на 4.7ггц работает на всю катушку!
http://cs617416.vk.me/v617416838/6645/SaHmTB9Z9rw.jpg

MAG79
Это хорошо, что повторяется. Ошибка однозначно в библиотеке SVP. Будем исправлять. Для этого нам надо три кадра в формате PNG или BMP: 76-ой и оба соседа слева и справа от него.

Видео глючит на разных кадрах, как выяснилось. поэтому кидаю целиком.
http://yadi.sk/d/F3c9eRNYNkAZD
и сам скрипт (2 потока gpu 0)

global svp_scheduler=true
global threads=2
global multi=4
global blendtimes=2

LoadPlugin("C:\Program Files (x86)\SVP\Plugins\svpflow1.dll")
LoadPlugin("C:\Program Files (x86)\SVP\Plugins\svpflow2.dll")

function BlendEveryTwoFramesIntoOne(clip src, int HowManyTimes)
{
  #blend = src.ConvertFPS(src.Framerate*2).SelectOdd.SelectOdd
  blend = src.ConvertFPS(src.Framerate*2).SelectEvery(4,1)
  return HowManyTimes<=0 ? src : BlendEveryTwoFramesIntoOne(blend, HowManyTimes-1)
}

SetMTMode(3,threads)
AVIsource("PlanetSide2_x64 2014-04-28 21-45-49-851.avi")
ConvertToYV12()
SetMTMode(2)

super_params="{gpu:0}"
analyse_params="{}"
smoothfps_params="{rate:{num:"+string(multi)+",den:1},scene:{blend:true}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
SVSmoothFps(super, vectors, smoothfps_params, mt=threads, url="www.svp-team.com")

BlendEveryTwoFramesIntoOne(blendtimes)

Distributor()

Кому-то может пригодится скрипт, который использует MFlowBlur для размытия движения. Его недостаток - слишком медленная работа. Для работы нужно указать threads и mblurquality

Скрипт спомощью SVP сначала увеличивает FPS исходного видео в 2 раза, чтобы сделать MFlowBlur более точным.
Затем применяет фильтр MFlowBlur
Затем возвращает FPS в исходное состояние

global svp_scheduler=true
global threads=4  # http://www.svp-team.com/wiki/Справка:Главное_меню:Количество_потоков
global multi=2
global blendtimes=1
global mblurquality=100 # 0-100 ; 100 is slowest

LoadPlugin("C:\Program Files\SVP\plugins\svpflow1.dll")
LoadPlugin("C:\Program Files\SVP\plugins\svpflow2.dll")

function BlendEveryTwoFramesIntoOne(clip src, int HowManyTimes)
{
  #blend = src.ConvertFPS(src.Framerate*2).SelectOdd.SelectOdd
  blend = src.ConvertFPS(src.Framerate*2).SelectEvery(4,1)
  return HowManyTimes<=0 ? src : BlendEveryTwoFramesIntoOne(blend, HowManyTimes-1)
}

SetMTMode(3,threads)
AVIsource("PlanetSide2_x64 2014-04-28 21-45-49-851.avi")
ConvertToYV12()
SetMTMode(2)

super_params="{gpu:1}"
analyse_params="{}"
smoothfps_params="{rate:{num:"+string(multi)+",den:1},scene:{blend:true}}"

super=SVSuper(super_params)
vectors=SVAnalyse(super, analyse_params)
SVSmoothFps(super, vectors, smoothfps_params, mt=threads, url="www.svp-team.com")

# MFlowBlur routines
#forward_mv = SVConvert(vectors, false)
#backward_mv = SVConvert(vectors, true)
#super_mv = MSuper(pel=1, hpad=0, vpad=0) #padding should be zero here!
#MFlowBlur(super_mv, backward_mv, forward_mv, blur=100, thSCD1=800, thSCD2=200)

super = MSuper(rfilter=2)
backward_vectors = MAnalyse(super, isb = true, truemotion=true, search = 3, delta = 1)
forward_vectors = MAnalyse(super, isb = false, truemotion=true, search = 3, delta = 1)
forward_re = MRecalculate(super, forward_vectors, truemotion=true, blksize=16)
backward_re = MRecalculate(super, backward_vectors, truemotion=true, blksize=16)
MFlowBlur(super, backward_re, forward_re, blur=int(mblurquality), thSCD1=800, thSCD2=200)

BlendEveryTwoFramesIntoOne(blendtimes)

#Distributor()

MAG79
Сейчас выполняется расчет со значениям параметров по-умолчанию, они сбалансированы в отношении качество/скорость.

Вон оно что, я просто посмотрел, что analyse_params вообще не заполнен, а smoothfps_params имели меньше настроек и поэтому подумал, что SVSmoothFps увеличивает число кадров не применяя свои алгоритмы поиска векторов, если всё же применяет и в наиболее сбалансированном виде, то это наоборот хорошо, т.к. важна скорость тоже.

В общем алгоритм нового скрипта такой (параметры multi=16 blendtimes=4)
FPS=30
- увеличиваем FPS видео в multi раз, используя умные алгоритмы SVP, получаем умные промежуточные кадры
FPS = 30*16 = 480

- затем blendtimes раз делается следующее:
- увеличиваем FPS но уже в 2 раза, при этом новые кадры создаются не по умному алгоритму, а просто смешиванием предыдущего и следующего кадра.
FPS = 480 * 2 = 960.
- Затем выбираются только четные кадры SelectOdd, тоесть FPS уменьшается в 2 раза
FPS = 960 / 2 = 480
- и еще раз
FPS = 480 / 2 = 240

Таким образом, прогон функции BlendEveryTwoFramesIntoOne уменьшает FPS входного потока в 2 раза (на входе 480, на выходе 240).

Пролучается, после SVSmoothFPS 16 мы имеем 30*16 = 480 фпс
1й проход BlendFrames = 240
2й проход 120
3й проход 60
4й проход 30 FPS

кажется я всё понял))))

upd.
А MFlowBlur действовала по другому алгоритму? upd. а я прочитал, да, там какой-то навороченный алгоритм вообще, используются векторы движения.. У нас тоже используются но иначе - на этапе увеличения фпс в фукнции SVSmoothFps

MAG79
А имеет ли смысл вместо увеличения FPS через ConvertFPS(Framerate*2), увеличивать фпс через функцию SVSmoothFPS?
И имеет ли смысл делать это с передачей полностью заполненых analyze_params и smoothfps_params как в скриптах SVP.

Чтобы кадры не просто блендились друг с другом, а через SVSmoothFPS рассчитывались новые более полноценно рассчитанные промежуточные кадры, с использованием рассчета по векторам и разных шейдеров, как в проекте SVP.

Chainik
дык да, здесь получился другой алгоритм
что бы получилось похоже, надо делать очень много шагов, не 8

Хм. я вот изучаю новый скрипт, там используется функция SVSmoothFps, таже самая, которая используется в проекте SVP. Я не очень могу понять действия которые новы скрипт проделывает.

По идее, новый скрипт в функции SVSmoothFps увеличивает с просчетом векторов и прочим количество кадров в multi (16) раз? то есть если исходное фпс 30, то после SVSmoothFps становится уже 480 (при значении multi = 16), То есть, в новом скрипте этап перегона 30 в 60 выполняется (даже с избытком - не в 60, а в 480 фпс)?

Но тогда я не пойму зачем нужна конструкция еще раз увеличивающая 480 фпс в 2 раза в этом месте:  ConvertFPS(src.Framerate*2) - рекурсивный скрипт, выполняющийся blendtimes раз.

Стоит ли вместо конструкции ConvertFPS(Framerate*2) использовать увеличитель фпс через функцию SVSmoothFPS?

Имеет ли смысл смысл в SVSmoothFPS передать параметры для полноценного просчета промежуточных кадров, заполнив analyze_params и smoothfps_params как в скриптах SVP:

analyse_params="{block:{overlap:0},main:{search:{coarse:{type:2,distance:-6},distance:0}}}"
global smoothfps_params="{rate:{num:2,den:1},algo:13,scene:{}}"

Можете, пожалуйста, обяснить принцип работы скрипта, что он делает пошагово? По идее, логика осталась таже самая - SmoothFPS увеличивает фпс, а затем уменьшает. Правда я здесь не вижу функции MMotionBlur... Чет совсем запутался.

MAG79
Согласно табличке количества потоков для двухъядерного процессора без GPU-ускорения надо указывать 3.

Действительно, стоило мне поставить количество потоков 4 (CPU Core2Duo + видеокарта 8600GT) и крэши прекратились, всё замечательно перекодировалось (и игровое видео и видео с регистратора), на заметно более высокой скорости и я видел, что оба ядра загружены на 100% - это приятно наблюдать - значит, дома на более скоростном процессоре и 5 потоках скорость будет еще выше.

Я сразу стал сравнивать результат со старым скриптом, который работал по схеме 30 to 60 (SVP) to 30 (old MotionBlur script). Новый скрипт на 8:3 заметно уступает в качестве старому (см. два скриншота для сравнения).
На 16:4, если смотреть покадрово, я уже не вижу разницы, но в целом смотрится не так хорошо, как предыдущее сочетание SVP + MMotionBlur. Я не могу точно объяснить почему, возможно просто эффект пласебо.

Судя по всему, крэш с svpflow_cpu был связан именно с неправильной настройкой потоков - имеет ли смысл выкладывать тестовые кадры на которых происходил крэш?

В целом новый скрипт на 16:4 вполне юзабелен как по качеству, так и по скорости, старый скрипт хоть и хорош, но обрабатывать на скорости 3 фпс это слишком.  Благодарен Вам за проделанную работу!

MAG79
Проверил на Virtual Dub 1.10.4 - cкрипт почему-то крэшит на 76 кадре (даже без перекодирования, чисто с виртуал даба покадрово нажимаю вперед и на 76 кадре крэш). Попытался перемотать чуть вперед (вдруг дропы в видео так влияют) - крэшит на 188 кадре. Попробовал MeGUI - его тоже крэшит, но там нельзя собрать CrashInfo. Собрал CrashInfo с Virtual Dub: http://pastebin.ru/FuNby76e

Crash context:
An out-of-bounds memory access (access violation) occurred in module 'svpflow_cpu'...

По сообщениям видно, что ошибка происходит в модуле svpflow_cpu. Скорее всего вы проверяли работу скрипта на GPU, а на CPU возможно что-то начинает идти не так. На другом видео (с видеорегистратора, а не игры) скрипт тоже крэшит.

У Вас разве не четырехядерный i5-3570?
Да, дома i5-3570+GTX260, а на работе Core2Duo E2160 и видеокарта 8600GT.

Скрипт пока проверил на работе. Т.к. ядра два - threads поставил 2 вместо 7, и выключил GPU, т.к. 8600GT не поддерживает вычислений.
Но крэшит и на разных значениях threads, и я пробовал SetMemoryMax устанавливать...  На работе установлена 32 разрядная версия Windows XP - возможно еще поэтому что-то идёт не так.

Вечером буду проверять дома.

MAG79 wrote:

Надо оставить исходные 30 к/сек, сложность обработки сразу снизится в 2 раза. Кроме этого отпадет необходимость в последнем вызове SelectOdd.

Я попробовал прогнать данный скрипт по исходному видео с 30 кадрами, но получилось слишком размазано. Возможно, я не убрал последний SelectOdd, нужно делать тесты.

MAG79 wrote:

blur=100 самый затратный способ получения размытия движения, .... Требуется именно такое размытие движения?

Не уверен что вообще требуется, я не занимался видео обработкой никогда, AviSynth только вчера первый раз опробовал, я даже не знал как эти скрипты в работу пускать... Описание прочитал, по умолчанию blur 50, попробую указать 50, проверю как отразится на скорости.

MAG79 wrote:

Все верно. В скрипте не указано разделение обработки на потоки для использования многоядерности процессора.

Подскажите пожалуйста, как указать чтобы скрипт работал в несколько потоков? этот параметр нужно указывать где-то глобально в теле скрипта или в каждой функции? В справке к MFlowBlur не вижу параметра threads или что-то похожее. Вижу правда там bool isse, подозреваю, что это оптимизация под инструкции SSE.

MAG79 wrote:

Наверняка можно. Видеокарта ведь имеется? Вроде бы GTX260. Тогда можно еще и ее задействовать. Самостоятельно справитесь?

Верно, видеокарта у меня GTX260, хоть и старая, но она уже поддерживала вычисления.
В деле работы с видео я новичёк совсем, и тем более если говорить о скриптах для AVISynth... может быть у вас найдётся время переписать этот скрипт в более оптимизированный вариант? Я думаю, что он очень пригодился бы и не только мне.
----
UPD.
Сравнил этот скрипт со скриптом SVP на предмет замены функций на SVPшные, в скрипте SVP есть функция SVAnalyse, но параметры в ней идут совсем другие чем в MAnalyze:

SVAnalyse(super, analyse_params, src=input)
MAnalyse(super, isb = true, truemotion=true, search = 3, delta = 1)

Chainik
ну значит скорость ограничена кодировщиком, а не скриптом

поидее не должна, ведь я использую losseless-кодеки
исходник в Lagarith (900x720 @ 60 - после SVP), а результат пишу новым супер-быстрым losseless кодеком MagYUV (и пишу на другой HDD от исходника). Немного странно, правда, что загружено на 100% только 1 ядро процессора вместо двух, но в любом случае даже если ускорить в 2 раза, 8 фпс это медленно.

MAG79
А если без сохранения выполнить Run video analysis pass?
Run video analysis показывает 2.80 FPS - то есть разницы никакой

Какую скорость обработки Вы бы назвали приемлемой?
Ну хотябы такую же как у SVP-скрипта. Он перегоняет из 30 в 60 на скорости ~27 фпс. и мне кажется, задача, которую выполняет SVP более сложная, чем просто вычислить вектор направления и применить motionblur в этом направлении (насколько я смог понять из текста скрипта).

Анализ движения и вычисление векторов ведь тоже есть в SVP, я подумал, может можно как-то переписать этот скрипт, чтобы он использовал более свежие и оптимизированные функции из svp-шных dll. Или может сам AVS скрипт написан не самым оптимальным образом.

Взял скрипт для перегона SVP 60fps -> Youtube 30fps здесь http://forum.ixbt.com/topic.cgi?id=29:34641

AVIsource("2.avi")
ConvertToYV12()

super = MSuper(rfilter=2)

backward_vectors = MAnalyse(super, isb = true, truemotion=true, search = 3, delta = 1)
forward_vectors = MAnalyse(super, isb = false, truemotion=true, search = 3, delta = 1)

forward_re = MRecalculate(super, forward_vectors, truemotion=true, blksize=16)
backward_re = MRecalculate(super, backward_vectors, truemotion=true, blksize=16)

MFlowBlur(super, backward_re, forward_re, blur=100, thSCD1=800, thSCD2=200)

ConvertFPS(Framerate*2).SelectOdd.SelectOdd
ConvertFPS(Framerate*2).SelectOdd.SelectOdd
ConvertFPS(Framerate*2).SelectOdd.SelectOdd
SelectOdd

Скрипт отрабатывает чудесно! видео выглядит плавно. Но работает очень-очень медленно - VirtualDub через AVS скрипт обрабатывает всего 3-4 кадра в секунду.

Я убрал строки переконвертирования FPS и оставил только одну строку вместо четырёх:

ConvertFPS(Framerate*2).SelectOdd.SelectOdd

Но производительность осталась почти на том же уровне.

Возможно ли как-то ускорить этот скрипт, используя более оптимизированные библиотеки SVP? или каким-то другим способом повысить производительность. Результат работы скрипта мне очень нравится, но скорость просто неприемлема sad

Вот короткий фрагмент результат
https://www.youtube.com/watch?v=6LqB5LU234M

А есть ли возможность совместить в одном скрипте GameDropFix_v4 и SVP с наилучшими настройками и самым качественным шейдером и вконце обратно конвертнуть в 30 фпс плавным блендингом?

Nightfox действительно прикольно получается, но это костыль.

MAG79
Я прочитал, про функцию ConvertFPS. Нельзя ли спомощью него сделать псевдо 60 фпс на 30 фпсном видео? Имеет ли смысл перегонять 30 фпс в 60 и назад, чтобы сделать движения более плавными?


ConvertFPS - Фильтр делает попытку преобразовать частоту кадров клипа clip к значению new_rate без выкидывания или вставки кадров, предлагая плавное преобразование с результатом, аналогичным автономным преобразовательным устройствам. Выход будет (почти) той-же длительности, как и clip, но число кадров изменится пропорционально соотношению целевой и исходной частот кадров.

Подскажите, как перестроить скрипт GameDropFix_v4 под видео с количеством FPS отличным от 60.  Например если мне нужно восстановить дропы в видео, которое записывалось на скорости 30фпс или 8фпс (видеорегистратор).

Или вообще если кадры выпадают и FPS изменяется постоянно

MAG79 wrote:

Dave_Scream
Какие параметры у Ваших видеозаписей (разрешение, частота кадров)?

У меня i3570 @ 4.7ггц, память DDR3 @ 2000mhz, GTX260, SSD диск.
Фпс в игре минимум проседает до 38, но это шутер, и фпс очень критичен, поэтому настройки записи специально хочу подобрать, чтобы производительность в игре почти не затрагивалась.

Во время записи процессор загружен всего на 40%, но фпс все равно падает где-то на 10. Я делаю вывод, что потоком данных перегружается сама система ввода-вывода.

Мои настройки:
Пишу в 30fps, игра идет на 1280х1024, но я записываю в 900x720, чтобы уменьшить поток данных и разгрузить систему ввода-вывода. Для этих же целей вместо losseless кодеков, использую x264vfw, хотя у меня SSD.

Для игрового видео план такой
1. GameDropFix_v4 - устраняет изъяны видео (насколько возможно)
2. SVP увеличивает фпс

и вот следующий шаг скрипт, который бы делал плавный блендинг кадров между собой, чтобы конвертнуть обратно с 60 до 30 фпс и заливать на ютюб в псевдо 60фпс.  Есть ли такой скрипт?

Всем привет,
я изучаю способы записи игрового видео и выкладывания на ютюб... игровые видео получаются довольно дёрганными, частенько кадры дропаются, но когда я смотрю такие видео через SVP всё выглядит очень приятно. Хотелось бы перед выкладыванием на youtube сохранять видео, прошедшее через SVP. В самой программе такой функции я не нашёл.

Прошу объяснить поподробнее как можно сохранить в файл улучшенное с помощью SVP видео?

Насколько понимаю, решения в виде простой программы нет, и нужно создать какие-то AVS-скрипты и потом подсунуть эти скрипты какой-то программе.

Прошу более подробно рассказать:
- как создать AVS скрипт именно тот, который использует SVP при воспроизведении того или иного видео и чтобы он не только уплавнял, но и восстанавливал выпавшие кадры
- возможно ли в этом скрипте подгрутить гамму повыше заодно?
- и самое главное, куда и как этот AVS скрипт подсовывать? подскажите пожалуйста программы, которые понимают AVS скрипты

Да у меня уже с год зависания тоже при перемотках. Но я юзаю стандартный плеер, идущий в комплекте с SVP.

Зависает только при активных перемотках. Такое ощущение, что зависает, когда он только начал уплавнять и ты опять перематываешь.

Почему на ютюб доступно качество 480, а sfptube отображает только 360 ?
http://dl.dropbox.com/u/3755765/2013-01-26_210220.jpg

в настройках стоит 720
http://dl.dropbox.com/u/3755765/2013-01-26_210340.jpg

Ребят, если проблема с инструкциями. Может поставите движок коллективной WIKI? вот для примера как на ресурсе http://bankomatchik.ru/wiki/ - есть вики, каждый зарегистрировавшийся может добавлять туда информацию. Это бы позволило упростить создание нормальной коллективной справки. Авторы бы чисто уточняли инфу от пользователей.

Еще бы раздел Вопрос/ответ создать, я бы там позадавал вопросов.
например:
- чем Enhanced Video Renderer лучше/хуже madVR в чем их отличия, зачем нужен madVR
- какой алгоритм upscaling в madVR лучше выбрать
- почему у меня идет регулярный дроп фреймов (EVR madVR), хотя загрузка 4х ядер CPU 50% и GPU Load около 25%   - дроп перестает идти токо в exclusive mode - но в нем не удобно смотреть, нужен так же оконный режим, что можно сделать с этим непонятным дропом фреймов, когда загрузка около 50%

спасибо за ответы. можно еще одно уточнение. Вот я хочу что-то добавить в обработку. Как мне это лучше сделать? Насколько понял в AVISynth скрипт добавлять не верно, поскольку его перезапишет SVPменеджер.

Значит если я хочу добавить туже устранение тряски.. или удаление дублирующих кадров - я должен редактировать скрипт на выходе SVPтулс. Это верно?

ведь насколько я понял файл скрипта SVP динамически перезаписывается шаблоном на яве? тогда подскажите, на каком этапе и в каком файле правильно будет вносить добавления в скрипт обработки, чтобы изменения не удалилялись при переделке скрипта (например смена профиля при смене качества видео,  чтобы не добавлять эти изменения каждый раз перед стартом видео и чтобы они не перезаписывались?

Здравствуйте. Я только сегодня установил SVP, облазил хэлп и форум, пока не нашел ответа на некоторые вопросы.

1. Меня заинтересовали дополнительные функции как, например стабилизация изображения на ходу.

читая хэлп я вижу вот такое меню, в котором не нужно редактировать никаких скриптов, там уже есть пункт Стабилизация тряски:
http://dl.dropbox.com/u/3755765/2013-01-26_005606.jpg

однако в реальности, устновив SVP и включив режим эксперта, в меню эти пункты отсутствуют:
http://dl.dropbox.com/u/3755765/2013-01-26_005033.jpg

почему отсутствуют? убрали в новой версии? зачем?

если убрали, то как, заставить работать указанный в хэлпе скрипт устранения тряски, куда его добавить? в какой файл и в каком виде? где найти туториал как правильно инсталлировать скрипты и добавлять dllки устранения дрожания, о которых говорится в хэлпе (MVTools2).

2. В хэлпе и на форуме говорится о неких профилях для мощных слабых средних машин. в каждом профиле есть свои подпрофили для разных разрешений. В скрине на хэлпе я вижу пункт выбора профиля. Однако опять же таки в установленой мной самой свежей версии SVP 3.1.3 full - вообще отсутствует пункт выбора профиля. Почему? как его можно поменять?