Re: Замена выпавших кадров (drop'ов) и SVP
А есть ли возможность совместить в одном скрипте GameDropFix_v4 и SVP с наилучшими настройками и самым качественным шейдером и вконце обратно конвертнуть в 30 фпс плавным блендингом?
You are not logged in. Please login or register.
SmoothVideo Project → Эксплуатация SVP → Замена выпавших кадров (drop'ов) и SVP
А есть ли возможность совместить в одном скрипте GameDropFix_v4 и SVP с наилучшими настройками и самым качественным шейдером и вконце обратно конвертнуть в 30 фпс плавным блендингом?
Dave_Scream
как перестроить скрипт GameDropFix_v4 под видео с количеством FPS отличным от 60
Ничего перестраивать не надо. Этот скрипт работает одинаково корректно для видео с любой частотой кадров. Хоть 60, хоть 30, хоть 25.
если кадры выпадают и FPS изменяется постоянно
Надо определить для себя какую ПОСТОЯННУЮ частоту кадров выбрать. Сейчас многие выбирают 30 к/сек, т.к. это компромисс плавности движений, затратности на производство, размера видео и возможностей онлайн сервисов (тот же YouTube).
есть ли возможность совместить в одном скрипте GameDropFix_v4 и SVP с наилучшими настройками и самым качественным шейдером и вконце обратно конвертнуть в 30 фпс плавным блендингом?
Теоретическая наверное есть. Но скрипт GameDropFix_v4 очень требовательный к памяти и капризный к многопоточности. Может просто нехватить ресурсов. Плюс нужно иметь некоторую подготовку и свободное время, чтобы заниматься такими экспериментами. Проще сделать эту обработку отдельными этапами. С контролем картинки на выходе каждого этапа. Так даже быстрее получается, как показывает практика.
О здравствуйте, MAG79!
Я к сожалению несколько далек от AviSynth, плагинов к нему и тп, так как работаю на Маке..
У меня такая проблема: на записи передачи одна из камер начала сбоить и записала видео с дропами.
https://www.dropbox.com/s/y0gp8qpqvd0nr … pravki.mov
Видео 1920x1080 50i, дропы - 3 кадра (соответственно 6 полукадров) максимум.
Вопрос - справится ли с таким безобразием Ваш плагин?
Добрый день.
Подскажите ни как не пойму а сопстно как использовать скрипт для дропов в реальном времени, ну а заодно и при перекодировании.
Кодирую xvid4psp, смотрю плеером jetaudio либо MPC.
Здравствуйте!
не могу сообразить как правильно использовать скрипт 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 кадров и со звуком )
помогите пожалуйста разобраться.
а вообще, я сюда попал по причине поиска скрипта, для преобразования 60 fps full hd видео в 30, при этом что бы видео сохраняло "плавность" 60 кадрового.
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 делает совсем не то. Он восстанавливает выпавшие кадры, сохраняя частоту кадров нетронутой. Вам нужен другой скрипт.
fastneed
Обсуждение выкладывания 60 fps видео на youtube перенесено в тему:
Как сохранить плавность 60fps видео при размещении на YouTube
(тема 2012 года, но там описаны актуальные вещи)
У меня тоже не получается приделать 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)
Почему он не видит этот fix_clip - ума приложить не могу((
Dave_Scream
Не знаком с синтаксисом MeGUI - надо разбираться.
function DropFix(clip Input, int "Threads")
{
src=last
...
Раз весь скрипт обернут в функцию, то нужно позаботиться еще о клипе, хранящемся в переменной last. Изначально там пусто, а должно быть Input. Как минимум, так:
function DropFix(clip Input, int "Threads")
{
Input
src=last
...
Это недоработка, лежащая на поверхности. Возможно, имеются еще.
На просторах интернета нашёл еще один скрипт, лечащий фиксы. Работает быстрее чем 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)
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 и замены выпавших кадров. Иначе я не уверен в работоспособности алгоритмов замены выпавших кадров на уже стабилизированном видео, где каждый кадр (реальный и дубль) подвинуты и развернуты относительно друг друга.
Все-таки сперва надо восстановить желаемую равномерность движений, а потом делать постобработку: стабилизация, чистка, резкость.
С новым годом.
У меня есть видео .avi/AVC1, и при открытии в VirtualDub скрипта GameDropFix_v4 у меня начинается непредсказуемое появление первого кадра видео вместо положенного по порядку в данный момент. Соответственно, предполагаю что он рисуется на месте дублей.
crystallize
Большой файл? На яндекс-диске поместится?
Я бы глянул...
crystallize
Большой файл? На яндекс-диске поместится?
Я бы глянул...
https://yadi.sk/i/VOmUbJlrdm8hz
Это просто рип с ютуба, я вырезал кусочек.
crystallize
Посмотрел наконец выложенный AVI-файл. Я функцию открытия в скрипте GameDropFix_v4 заменил на
AVISource("D:\Downloads\crystallize\1.avi",audio=false)
Так никаких непредсказуемых появлений первого кадра нет, если не считать первые 10240 кадров, которые все одинаковые. Они повторяются только на одном участке 10266 - 10315. Это такая запись. В остальном скрипт работает "как часы", т.е. уверенно и предсказуемо заменяет кадры-дубли на интерполированные кадры.
MAG79
Спасибо большое, видимо DSS2 просто так ведёт себя с ютубовскими mp4.
Можно спросить? При попытке кодирования в 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 пришлось искать и обновлять.
Как всегда опять сам через много часов нашёл причину. Ощущение, что на форумах больше помогают тем, кто жестко тупит и даже азов не знает, а если умный и что-то сам понять можешь - иди, сам справишься.
1. Обновить все DLL файлы.
2. Установить HAALI Media Splitter
3. Для моего нестабильного видео нужно стабилизировать частоту, а потом уже фиксить дропы. Это я знал и раньше, но как именно это сделать и удачно смог только сейчас.
В источнике вместо FFmpegSource2 нужно использовать DirectShowSource("Адрес_И_Имя.mp4", fps=ОРИГИНАЛ(60 ИЛИ 30), convertfps=true)
4. Ссылка на все обновленные файлы http://gavitex.com/share/x2f4vmhnn
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]###
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?
Откуда взялась цифра 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() в конце скрипта - без него не заработает многопоточность
Спасибо. Меня беспокоит то, что эта ошибка визуализируется на видео как Лого. Это новая поза, в которой xvid4psp решил меня "полюбить". Дело в том, что она просто так решила появится. Вначале краш х264 из-за нехватки 4ГБ ОЗУ, а при следующей загрузке БАЦ, и появилось! В этой проге сидит чудище-бабай и не дает пофиксить даже одно видео. Чего стоит 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
James D
Все ошибки avisynth так визуализируются. Как Лого.
Threads, svp_scheduler и svp_cache_fwd и правда на месте. Неуглядел. Тогда скрипт должен работать. Грубых ошибок нет.
Почему не работает - надо уже на конкретной машине разбираться с конкретным XviD4PSP.
Фиолетовые строки просто подсвечивают синтаксис. В этом месте он корректный.
Ясно. Тогда последние 2 простых вопроса на сегодня:
1) Для всех видео нужен framecount-10?
а второй забыл пока первый писал)
SmoothVideo Project → Эксплуатация SVP → Замена выпавших кадров (drop'ов) и SVP
Powered by PunBB, supported by Informer Technologies, Inc.