Re: Замена выпавших кадров (drop'ов) и SVP

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

102

Re: Замена выпавших кадров (drop'ов) и SVP

Dave_Scream
как перестроить скрипт GameDropFix_v4 под видео с количеством FPS отличным от 60
Ничего перестраивать не надо. Этот скрипт работает одинаково корректно для видео с любой частотой кадров. Хоть 60, хоть 30, хоть 25.

если кадры выпадают и FPS изменяется постоянно
Надо определить для себя какую ПОСТОЯННУЮ частоту кадров выбрать. Сейчас многие выбирают 30 к/сек, т.к. это компромисс плавности движений, затратности на производство, размера видео и возможностей онлайн сервисов (тот же YouTube).

есть ли возможность совместить в одном скрипте GameDropFix_v4 и SVP с наилучшими настройками и самым качественным шейдером и вконце обратно конвертнуть в 30 фпс плавным блендингом?
Теоретическая наверное есть. Но скрипт GameDropFix_v4 очень требовательный к памяти и капризный к многопоточности. Может просто нехватить ресурсов. Плюс нужно иметь некоторую подготовку и свободное время, чтобы заниматься такими экспериментами. Проще сделать эту обработку отдельными этапами. С контролем картинки на выходе каждого этапа. Так даже быстрее получается, как показывает практика.

103 (edited by AMCDM 12-06-2014 19:34:35)

Re: Замена выпавших кадров (drop'ов) и SVP

О здравствуйте, MAG79!
Я к сожалению несколько далек от AviSynth, плагинов к нему и тп, так как работаю на Маке..
У меня такая проблема: на записи передачи одна из камер начала сбоить и записала видео с дропами.
https://www.dropbox.com/s/y0gp8qpqvd0nr … pravki.mov
Видео 1920x1080 50i, дропы - 3 кадра (соответственно 6 полукадров) максимум.
Вопрос - справится ли с таким безобразием Ваш плагин?

Re: Замена выпавших кадров (drop'ов) и SVP

Добрый день.
Подскажите ни как не пойму а сопстно как использовать скрипт для дропов в реальном времени, ну а заодно и при перекодировании.
Кодирую xvid4psp, смотрю плеером jetaudio либо MPC.

105 (edited by fastneed 17-11-2014 20:29:32)

Re: Замена выпавших кадров (drop'ов) и SVP

Здравствуйте!
не могу сообразить как правильно использовать скрипт gamedropfixv4 (я чутка так чайник, новичок как есть)
пытался я мудрил мудрил, по-моему ничего у меня не получается.
итого такой скрипт получился, в конце отдельно напишу что мне пришлось изменить.

SetMemoryMax(2048)
global svp_scheduler=true
global threads=5
global svp_cache_fwd=threads+10
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\mvtools2.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\svpflow1.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\svpflow2.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\masktools2-25.dll")
LoadPlugin("M:\soft\Video Edit\MeGUI\tools\ffms\ffms2.dll")

source = "Source.mp4"
FFVideoSource("m:\soft\Video Edit\MeGUI\Source.mp4")
AudioDub(FFVideoSource(source), FFAudioSource(source))
ConvertToYV12()
src=last
super_params_mini="{scale:{up:0},gpu:1}"
analyse_params_mini="{block:{w:8,h:8}}"
miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(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(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(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)

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
")

trim(0,framecount-10)


вот так я подгружаю DLL, почему-то просто с папки с плагинами оно не охотно читается.
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\mvtools2.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\svpflow1.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\svpflow2.dll")
LoadPlugin("c:\Program Files (x86)\AviSynth 2.5\plugins\masktools2-25.dll")
LoadPlugin("M:\soft\Video Edit\MeGUI\tools\ffms\ffms2.dll")

source = "Source.mp4"
FFVideoSource("m:\soft\Video Edit\MeGUI\Source.mp4")
AudioDub(FFVideoSource(source), FFAudioSource(source))
ConvertToYV12()

а тут я пытаюсь указать источник, он у меня .mp4 ful hd 60 fps а так же звуковая дорожка, но с ней дебри еще те..(рассинхрон получается)

еще у меня ошибку вызывают параметры SetMTMod и последний в скрипте Distributor(), пришлось их удалить..
в итоге скрипт вроде как съедается (как MeGUI так и AMVSimple_4.0) но AMVSimple_4.0 на выходе дает 25 кадров ну и  звук не в теме, а MeGUI вовсе без звука отрендерило, при этом видео осталось 60 кадров (наверное все верно получилось, но мне нужно что бы стало 30 кадров и со звуком sad )

помогите пожалуйста разобраться.

а вообще, я сюда попал по причине поиска скрипта, для преобразования 60 fps full hd видео в 30, при этом что бы видео сохраняло "плавность" 60 кадрового.

может я вообще не туда попал? оО

106

Re: Замена выпавших кадров (drop'ов) и SVP

fastneed

LoadPlugin...

Да. Можно и так.

FFVideoSource("m:\soft\Video Edit\MeGUI\Source.mp4")
AudioDub(FFVideoSource(source), FFAudioSource(source))

Достаточно второй строчки. Первая строчка игнорируется, т.к. переменная last переназначается второй строкой. Первую строку смело можно удалить из скрипта без последствий.

ошибку вызывают параметры SetMTMod и последний в скрипте Distributor()
Это команды работы с многопоточностью. Скрипт будет работать и без них, но медленнее на многоядерных процессорах, чем мог бы. Для поддержки этих команд нужно установить многопоточную версию avisynth. См. Avisynth MT.

на выходе дает 25 кадров
Есть такой глюк у некоторых контейнеров (кодировщиков), что неверно инициализируют частоту кадров. Надо использовать ключ x264: --fps 30 (для Вашего случая)

Я бы звук не пропускал бы через скрипт, а взял бы звуковую дорожку прямо из исходника без изменений.

поиска скрипта, для преобразования 60 fps full hd видео в 30, при этом что бы видео сохраняло "плавность" 60 кадрового
Ну, скрипт GameDropFix делает совсем не то. Он восстанавливает выпавшие кадры, сохраняя частоту кадров нетронутой. Вам нужен другой скрипт.

107

Re: Замена выпавших кадров (drop'ов) и SVP

fastneed
Обсуждение выкладывания 60 fps видео на youtube перенесено в тему:
Как сохранить плавность 60fps видео при размещении на YouTube

(тема 2012 года, но там описаны актуальные вещи)

108 (edited by Dave_Scream 20-11-2014 18:56:29)

Re: Замена выпавших кадров (drop'ов) и SVP

У меня тоже не получается приделать 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 - ума приложить не могу((

109

Re: Замена выпавших кадров (drop'ов) и SVP

Dave_Scream
Не знаком с синтаксисом MeGUI - надо разбираться.

function DropFix(clip Input, int "Threads")
{
src=last
...

Раз весь скрипт обернут в функцию, то нужно позаботиться еще о клипе, хранящемся в переменной last. Изначально там пусто, а должно быть Input. Как минимум, так:

function DropFix(clip Input, int "Threads")
{
Input
src=last
...

Это недоработка, лежащая на поверхности. Возможно, имеются еще.

Re: Замена выпавших кадров (drop'ов) и SVP

На просторах интернета нашёл еще один скрипт, лечащий фиксы. Работает быстрее чем 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)

111

Re: Замена выпавших кадров (drop'ов) и SVP

Dave_Scream
Переменная частота кадров (vfr) присутствует в видео, пока оно хранится в файле. Как только это видео попадает в Avisynth - оно становится с постоянной частотой кадров путем выкидывания лишних и повторения недостающих кадров (подробнее про vfr и avisynth). Разумеется такое вольное преобразование итак неидеально плавного видео еще больше усиливает рывки в движениях при воспроизведении. О частоте кадров надо заботиться самому. Желательно выполнить анализ видеофайла и узнать базовую частоту кадров, на которой снято это видео. Указав эту базовую частоту при открытии файла можно получить минимум искажений от преобразования vfr > cfr.

например если FPS скачет от 29 до 16
В этом случае скорее всего базовая частота 30 fps. Утилиты mkv2vfr и mp4dump помогут узнать точнее (см. по ссылке выше).

скрипты FillDrops, GameDropFix и все другие уже на входе имеют видео с постоянной частотой кадров, но среди кадров могут быть пропущенные кадры и кадры-дубли.
FillDrops умеет исправлять только одиночные кадры-дубли, ориентируясь на степень различий двух соседних кадров.
GameDropFix умеет исправлять одиночные, двойные, тройные дропы и пропущенные кадры, ориентируясь на характер движений в кадре, стараясь максимально выровнять рывки в движениях. Подробнее см. табличку сравнения DoubleDropFix против GameDropFix. При этом по качеству и возможностям скрипт DoubleDropFix находится между скриптами FillDrops и GameDropFix.

прогоняю DropFix'ом
- и затем спомощью SVP делаю видео с нужным фпс - обычно это 60FPS

Тогда рекомендую выполнять эти два действия в один проход: открывать видео с параметрами (ConvertFPS=True, fps=60), делая однократный расчет недостающих кадров путем добавления интерполированных кадров скриптом GameDropFix. Повысится скорость обратботки, а главное - с таким подходом исключается двойное интерполирование, за счет чего повысится как плавность движений, так и качество отдельно взятых кадров.

Стабилизацию и чистку я бы делал после преобразования fvr > cfr и замены выпавших кадров. Иначе я не уверен в работоспособности алгоритмов замены выпавших кадров на уже стабилизированном видео, где каждый кадр (реальный и дубль) подвинуты и развернуты относительно друг друга.
Все-таки сперва надо восстановить желаемую равномерность движений, а потом делать постобработку: стабилизация, чистка, резкость.

Re: Замена выпавших кадров (drop'ов) и SVP

С новым годом. smile
У меня есть видео .avi/AVC1, и при открытии в VirtualDub скрипта GameDropFix_v4 у меня начинается непредсказуемое появление первого кадра видео вместо положенного по порядку в данный момент. Соответственно, предполагаю что он рисуется на месте дублей.

113

Re: Замена выпавших кадров (drop'ов) и SVP

crystallize
Большой файл? На яндекс-диске поместится? wink
Я бы глянул...

Re: Замена выпавших кадров (drop'ов) и SVP

MAG79 wrote:

crystallize
Большой файл? На яндекс-диске поместится? wink
Я бы глянул...

https://yadi.sk/i/VOmUbJlrdm8hz
Это просто рип с ютуба, я вырезал кусочек.

115

Re: Замена выпавших кадров (drop'ов) и SVP

crystallize
Посмотрел наконец выложенный AVI-файл. Я функцию открытия в скрипте GameDropFix_v4 заменил на

AVISource("D:\Downloads\crystallize\1.avi",audio=false)

Так никаких непредсказуемых появлений первого кадра нет, если не считать первые 10240 кадров, которые все одинаковые. Они повторяются только на одном участке 10266 - 10315. Это такая запись. В остальном скрипт работает "как часы", т.е. уверенно и предсказуемо заменяет кадры-дубли на интерполированные кадры.

Re: Замена выпавших кадров (drop'ов) и SVP

MAG79
Спасибо большое, видимо DSS2 просто так ведёт себя с ютубовскими mp4.

117 (edited by James D 22-01-2015 13:49:23)

Re: Замена выпавших кадров (drop'ов) и SVP

Можно спросить? При попытке кодирования в Xvid4PSP 5 с GameDropFix_v4 выбивает сообщение "AviSynth Encoder Error: I don't know what "stereo_type" means"

После того, как убрал весь раздел ########## BEGIN OF MSMoothFps.avs ########## - только тогда заработало. Но ведь когда я прошу SVP сформировать скрипт для Xvid4PSP 5 - программа мне выдает его как часть скрипта. Выносил этот раздел и после FILTERING и в середине FILTERING - пока не убрал полностью не хотело работать..

Видео у меня VRF. Frame rate : 57.903 fps | Original frame rate : 60.000 fps | Minimum frame rate : 0.231 fps | Maximum frame rate : 112.570 fps
Записывал геймплей, лаги были видимо. SVP пишет Assume 57.902.
Вопрос а) как мне нужно писать значения фпс в скрипте, чтобы и фиксило дропы и четко все было (60? 57.903?). Желательный итог 60.000 Constant, чтоб на youtube залить можно было.
Прав ли я, что в источнике нужно ASSUME=60, а сразу после ConverttoYuv12 писать ChangeFPS(60.000) и тогда уже можно делать Filtering GameDropFix?

Ибо если строку Change не писать - то в итоге видео и аудио размера одинаковы, но из-за лагов в исходнике с под 0 фпс синхронизация скачками все хуже и хуже вплоть до 5 сек.

Вопрос б) Я в скрипте GamedDropFix в самый первый раз забыл выставить значение фпс и оно решило, что видео 25 к/с. На будущее, можно ли будет перемуксить в 57 или 60 (как там надо?) файл ИМЯ.264? Или заново кодировать?

SCRIPT
------------------------------
Import("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\functions\AudioFunctions.avs")
Import("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\functions\VideoFunctions.avs")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\FFMS2.dll")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\MVtools2mod.dll")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\masktools2-25.dll")
Import("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\FFMS2.avsi")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\bass\bassAudio.dll")

video = FFmpegSource2("D:\Left 4 Dead 2 01.21.2015 - 17.10.17.03.DVR.mkv", rffmode=0, threads=1, cachefile="T:\Temp\Left 4 Dead 2 01.21.2015 - 17.10.17.03.DVR.mkv.ffindex").AssumeFPS(25.000)
audio = bassAudioSource("T:\Temp\0003_0.aac")
AudioDub(video, audio)

ConvertToYV12()

###[FILTERING]###
# This script was generated by SmoothVideo Project (SVP) Manager.
# Check http://www.svp-team.com for more details.

SetMemoryMax(1024)
global svp_scheduler=true
global threads=5
global svp_cache_fwd=threads+10

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

SetMTMode(3,threads)
SetMTMode(2)

src=last
super_params_mini="{scale:{up:0},gpu:1}"
analyse_params_mini="{block:{w:8,h:8}}"
miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(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(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(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)

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
")

trim(0,framecount-10)

###[FILTERING]###



AUDIO ENCODING
------------------------------
Encoding audio to: T:\Temp\0006.m4a
AAC Q0,45 2ch 16bit 48000khz

neroAacEnc.exe: -ignorelength -q 0.45 -lc -if - -of "T:\Temp\0006.m4a"


VIDEO ENCODING
------------------------------
Encoding video to: T:\Temp\0006.264
x264 Q21.0 1920x1080 25.000fps (38203 frames)

x264.exe: --crf 21.0 --ref 8 --deblock -1:-1 --direct auto --b-adapt 2 --trellis 2  --no-fast-pskip  --psy-rd 1.0:0.1 --partitions all --me umh --rc-lookahead 50 --sar 1:1 --output "T:\Temp\0006.264" "T:\Temp\0006.avs"

avs [info]: 1920x1080p 1:1 @ 25/1 fps (cfr)
x264 [info]: using SAR=1/1
x264 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
x264 [info]: profile High, level 5.0

P.P.S. Фух, потратил опять не один час на обновление dll файлов xvid4psp. По какой-то причине пришлось добавить строки addplugin: MVtools2, masktools2, хотя вы писали, что GameDropFix работает только на SVP плагинах.
Так же еще кучу каких-то других dll пришлось искать и обновлять.

118 (edited by James D 22-01-2015 22:56:08)

Re: Замена выпавших кадров (drop'ов) и SVP

Как всегда опять сам через много часов нашёл причину. Ощущение, что на форумах больше помогают тем, кто жестко тупит и даже азов не знает, а если умный и что-то сам понять можешь - иди, сам справишься.
1. Обновить все DLL файлы.
2. Установить HAALI Media Splitter
3. Для моего нестабильного видео нужно стабилизировать частоту, а потом уже фиксить дропы. Это я знал и раньше, но как именно это сделать и удачно смог только сейчас.
В источнике вместо FFmpegSource2 нужно использовать DirectShowSource("Адрес_И_Имя.mp4", fps=ОРИГИНАЛ(60 ИЛИ 30), convertfps=true)
4. Ссылка на все обновленные файлы http://gavitex.com/share/x2f4vmhnn

119

Re: Замена выпавших кадров (drop'ов) и SVP

James D
На простые вопросы проще отвечать, а на 10 сложных - это ведь еще и время найти надо wink

Re: Замена выпавших кадров (drop'ов) и SVP

OK. Вот простенький вопрос:
С какого ... почему в результате скрипта могло такое получиться? http://gavitex.com/share/e19df6ebe

Import("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\functions\AudioFunctions.avs")
Import("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\functions\VideoFunctions.avs")
SetMemoryMax(2048)
SetMTMode(3,8)
DirectShowSource("E:\Documents\Desktop\Left 4 Dead 2 01.21.2015 - 17.10.17.03.DVR.mp4", fps=60.903, convertfps=true)


ConvertToYV12()

###[FILTERING]###
# This script was generated by SmoothVideo Project (SVP) Manager.
# Check http://www.svp-team.com for more details.


global svp_scheduler=true
global threads=5
global svp_cache_fwd=threads+10

LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\svpflow1.dll")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\svpflow2.dll")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\MVtools2mod.dll")
LoadPlugin("C:\Program Files (x86)\XviD4PSP 5\dlls\AviSynth\plugins\masktools2-25.dll")


SetMTMode(2)

src=last
super_params_mini="{scale:{up:0},gpu:1}"
analyse_params_mini="{block:{w:8,h:8}}"
miniW = int(width/64)*32
miniW = (miniW<320) ? 320 : miniW
miniH = int(height/64)*32
miniH = (miniH<160) ? 160 : miniH
mini=BicubicResize(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(super_params)
vectors=SVAnalyse(super, analyse_params)
fix_all = SVSmoothFps(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)

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
")

trim(0,framecount-10)
###[FILTERING]###

121

Re: Замена выпавших кадров (drop'ов) и SVP

James D
Ошибка на видео по ссылке гласит:

I don't know what "fix_clip" means
([ScriptClip], line 2)

Скрипт не может найти, где присваивается переменная fix_clip
Ругается вот на эту конструкцию:

ScriptClip("
    AvgFix=fix_clip.AverageLuma
    AvgFix_next=fix_clip.trim(1,0).AverageLuma
    ...

Надо разбираться, я вижу, что AVS-скрипт видоизменен.
Вы хотите, чтобы я поотлаживал Ваш скрипт?
Может проще взять оригинальный работающий вариант GameDropFix_v4?

122

Re: Замена выпавших кадров (drop'ов) и SVP

Откуда взялась цифра 60.903?

DirectShowSource("E:\Documents\Desktop\Left 4 Dead 2 01.21.2015 - 17.10.17.03.DVR.mp4", fps=60.903, convertfps=true)

Я бы рекомендовал указать стандартную частоту. Либо 60, либо 59.94

В целом скрипт изменен только в начале и в конце.
Критический момент один:
- удалено присвоение переменной threads - она используется далее в скрипте и должна быть определена;
По мелочи:
- памяти выделено 2048 вместо 1024 - не знаю на что может повлиять;
- исключены строки регулирования кадрового кэша и управления памятью svp_scheduler и svp_cache_fwd - используются для avisynth 2.5.8 MT SVP edition, без них он работает медленней и потребляет больше памяти;
- не хватает Distributor() в конце скрипта - без него не заработает многопоточность

Re: Замена выпавших кадров (drop'ов) и SVP

Спасибо. Меня беспокоит то, что эта ошибка визуализируется на видео как Лого. Это новая поза, в которой xvid4psp решил меня "полюбить". Дело в том, что она просто так решила появится. Вначале краш х264 из-за нехватки 4ГБ ОЗУ, а при следующей загрузке БАЦ, и появилось! В этой проге сидит чудище-бабай и не дает пофиксить даже одно видео.  mad Чего стоит DirectShowSource: Couldn't open a video. Such type isn't supported.

А за отладку скрипта Спасибо. FPS всегда 60, просто xvid4psp всегда меняет его на 57.903 при изменении любой настройки и я спать хотел, разок промахнулся.

Критический момент один - удалено присвоение переменной threads

Вы уверены? Если Вы про global threads=5 - оно на месте, под #Filtering.
- исключены строки регулирования кадрового кэша и управления памятью
Тоже есть. В том же месте. Я скрипт вообще почти не менял, просто SetMemoryMax и SetMT в настройках xvid4psp выставил, а distributor пришлось удалить - не работал скрипт.

Фиолетовые строки - это ведь ненормально? http://c2n.me/3b1b9cw.png

124

Re: Замена выпавших кадров (drop'ов) и SVP

James D
Все ошибки avisynth так визуализируются. Как Лого.
Threads, svp_scheduler и svp_cache_fwd и правда на месте. Неуглядел. Тогда скрипт должен работать. Грубых ошибок нет.
Почему не работает - надо уже на конкретной машине разбираться с конкретным XviD4PSP.
Фиолетовые строки просто подсвечивают синтаксис. В этом месте он корректный.

Re: Замена выпавших кадров (drop'ов) и SVP

Ясно. Тогда последние 2 простых вопроса на сегодня:
1) Для всех видео нужен framecount-10?
а второй забыл пока первый писал)