Re: Замена выпавших кадров (drop'ов) и SVP
Bars
скачок, потом дроп
Да
для данного случая более высокая плавность будет достигнута за счет фикса обратных дропов
Да
You are not logged in. Please login or register.
SmoothVideo Project → Эксплуатация SVP → Замена выпавших кадров (drop'ов) и SVP
Bars
скачок, потом дроп
Да
для данного случая более высокая плавность будет достигнута за счет фикса обратных дропов
Да
MAG79
Да
А какие тогда недостатки (в плане качества, а не скорости) имеет GameDropFix_v3 в сравнении с DoubleDropFix_v3? (если применять для кино продукции, а не для игрового видео)
Если интересует качество, то вроде как получается, что GameDropFix_v3 лучше и универсальнее (разве что может у него другие настройки чувствительности определения дропов, либо какие-то другие параметры настроенные под игровое видео?).
P.S. А раз анализ движения уже реализован в GameDropFix_v3 может можно его тогда добавить и в DoubleDropFix_v4? (если не сложно)
Таблица сравнения этих двух скриптов.
какие тогда недостатки (в плане качества, а не скорости) имеет GameDropFix_v3
Излишняя сложность и лишние варианты обработки двойных и тройных дропов, которые обычно не встречаются в кино/видео записях.
Если интересует качество, то вроде как получается, что GameDropFix_v3 лучше и универсальнее
Да. Качество интерполяции выше, качество идентификации дропов выше. Вариантов замены больше. Это приводит к лучшей плавности на выходе.
какие-то другие параметры настроенные под игровое видео?
Текущее ограничение: скрипт настроен для видео с разрешением 1280x720 и частоты 60 к/сек. Под видео другого характера возможны ошибки из-за некратности сторон видео блокам 32x32 и может потребоваться перенастройка параметров, отвечающих за граничные значения обнаружения движений.
раз анализ движения уже реализован в GameDropFix_v3 может можно его тогда добавить и в DoubleDropFix_v4?
Проще взять GameDropFix, повырезать из него лишее и настроить под конкретный видеофайл. Если еще проще: то только настроить, ничего не вырезая.
MAG79
Таблица сравнения этих двух скриптов.
Спасибо, отличная табличка, теперь все хорошо видно (в таблице, кстати в паре мест лишняя единичка закралась и получилось Fix133 вместо Fix33)
Преимуществ у игрового скрипта действительно много, даже для фикса двойных дублей вариант -Fix50&Fix50 гораздо интереснее, чем Fix33&Fix66
Качество интерполяции выше, качество идентификации дропов выше. Вариантов замены больше. Это приводит к лучшей плавности на выходе.
Мне все больше хочется перейти на использование игрового скрипта
Вот только:
Текущее ограничение: скрипт настроен для видео с разрешением 1280x720 и частоты 60 к/сек. Под видео другого характера возможны ошибки из-за некратности сторон видео блокам 32x32 и может потребоваться перенастройка параметров, отвечающих за граничные значения обнаружения движений.
А это ограничение можно убрать? Снизить кратность, например, до 4x4 (я в лучшем случае встречаю кратность 16x16, а уж 32x32 вообще почти никогда не попадается) и т.д., т.е. сделать более универсальным? (DoubleDropFix был в принципе достаточно универсален и подходил практически для любого видео)
Проще взять GameDropFix, повырезать из него лишнее и настроить под конкретный видеофайл.
Это один раз настройка под конкретный видеофайл или под другие потом тоже что-то перенастраивать надо будет? Хотелось бы что-то универсальное, чтобы с любым видеофайлом хорошо работало.
Поможете с этой задачей? (из видеоматериала с дропами, кроме семпла выше и этой серии сериала, имеющей кроме циклических дублей, ещё и кучу дропов с различным скачками)
Если еще проще: то только настроить, ничего не вырезая.
Если не вырезать лишнее, то как я понимаю это скажется на скорости работы скрипта из-за лишней бесполезной нагрузки?
Bars
в таблице, кстати в паре мест лишняя единичка закралась и получилось Fix133 вместо Fix33
Единичка на своем месте. Это я привел разные системы обозначения к одному виду: положение кадра относительно текущего места с точки зрения скрипта.
Допустим, человек знает, что два кадра выпали. Он ассоциирует кадр перед дропом и две его копии как одно и то же и для него 33% и 66% - понятное обозначение двух положений между этим кадром и следующим.
Скрипт работает иначе: он должен заменить текущий выпавший кадр на интерполированный. Для первого пропущенного кадра его замена расположена в промежутке через кадр вперед на отметке 133%, а для второго выпавшего кадра промежуток берется тот же, но он раположен уже на кадр ближе, поэтому расстояние до него 66%.
некратности сторон видео блокам 32x32... ограничение можно убрать?
Можно.
Это один раз настройка под конкретный видеофайл или под другие потом тоже что-то перенастраивать надо будет?
Для начала - под конкретный файл. А дальше с каждой правкой скрипт будет все универсальней. Сразу всего не учтешь
Если не вырезать лишнее, то как я понимаю это скажется на скорости работы скрипта из-за лишней бесполезной нагрузки?
Да.
Поможете с этой задачей?
На сэмпле можно попробовать. Но у меня встречный вопрос: неужели нет более качественной копии этого фильма на DVD/VHS/еще где-либо без выпавших кадров?
MAG79
Для начала - под конкретный файл. А дальше с каждой правкой скрипт будет все универсальней. Сразу всего не учтешь
ОК, "кривой" видеоматериал мне попадается относительно часто, так что будет на чём экспериментировать.
На сэмпле можно попробовать.
Отлично, буду ждать!
Но у меня встречный вопрос: неужели нет более качественной копии этого фильма на DVD/VHS/еще где-либо без выпавших кадров?
Я всегда стараюсь найти самое наилучшее качество (Blu-ray,HDTV,DVD9,DVD5), а когда исходников не найти, нахожу и скачиваю все возможные варианты рипов, чтобы выбрать наилучший (по всем параметрам). Но иногда (преимущественно для редких фильмов и сериалов до 2000-х годов) выбирать просто не из чего (ни на закрытых трекерах, ни в др.местах, типа usenet), есть только один кривой рип с дропами. Без альтернатив. Разумеется, заниматься перекодировкой с фиксом дропов - это самая крайняя мера, т.к. просто нет другого выбора.
Bars
Адаптировал скрипт GameDropFix под любой размер кадра, а не только 1280x720, убрал необходмость кратности сторон кадра блокам 32x32.
На сэмпле работает почти идеально.
Скрипт GameDropFix_v4.
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)
DSS2("E:\Downloads\Bars\2013.10.21\test.avi").ConvertToYV12()
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)
Distributor()
MAG79
Адаптировал скрипт GameDropFix
Шикарно, спасибо! Завтра приступлю к тестированию (и в дальнейшем буду применять для всего материала с дропами), если найду какие-то недочёты - отпишусь здесь.
под любой размер кадра, а не только 1280x720, убрал необходмость кратности сторон кадра блокам 32x32.
Не упомянули про выбрасывание из скрипта лишнего, ненужного для обработки неигрового видео, чтобы улучшить быстродействие - не выбрасывали лишнее?
На сэмпле работает почти идеально.
А чего именно до идеала не хватает?
Bars
выбрасывание из скрипта лишнего, ненужного для обработки неигрового видео, чтобы улучшить быстродействие - не выбрасывали лишнее?
В скрипте GameDropFix_v4 сохранены все 8 вариантов замены одиночных, двойных и тройных дропов. Функциональность из скрипта не удалялась. Быстродействие не замерял, но вполне приемлемое. Тут уж либо быстродействие, либо универсальность.
чего именно до идеала не хватает?
"человечности"
Идеалом я считаю обработку каждого дропа с нулевым количеством ошибочно определившихся дропов. Сейчас скрипт удовлетворяет меня только на 99%
В 1% случаев скрипт ошибается.
Но для алгоритмов такого рода, где условия поиска и замены дропов сложно-формализуемы, невозможно добиться идеала. К нему можно только стремиться.
Конкретно этот алгоритм на конкретно этом сэмпле не пропустил ни одного дропа, но при этом:
- заменил дропы в длинной последовательности дропов (я такой логики вроде-бы в него не закладывал): кадры 1, 44
- ошибочно посчитал кадры с наличием минимального движения за дроп: кадр 75, 232, 323, 410, 411, 464, 473, 879, 990, 1148, 1160, 1236, 1253, 1281, 1460
Можно проверить самостоятельно в любом редакторе, например в AvsPmod, добавив в конец строку:
StackVertical(src,last)
Но обе претензии несущественны, т.к. первая неожиданно сокращает количество даже такого большого числа рядом расположенных дропов, а вторая частично ловит и заменяет смешанные кадры из двух соседних, частично ловит приостановки проводки камеры оператором, в обоих случаях сглаживая рывки и опять же делая видео плавнее. Причем на таких небольших интенсивностях движений на вставленных интерполированных кадрах артефакты в исчерпывающем большинстве случаев отсутствуют. С учетом этого уточнения выходит, что скрипт на этом сэмпле отработал идеально.
Ошибочное определение дропов настраивается параметрами min_move и max_stop (пкс). Первый параметр - минимальное движение в кадре, которое еще распознается за движение, второй - максимальное движение в кадре, который признается дропом при наличии рядом кадров с движением, быстрее текущего в move_idx раз.
MAG79
В скрипте GameDropFix_v4 сохранены все 8 вариантов замены одиночных, двойных и тройных дропов. Функциональность из скрипта не удалялась. Быстродействие не замерял, но вполне приемлемое. Тут уж либо быстродействие, либо универсальность
Ну просто чуть выше писали:
Проще взять GameDropFix, повырезать из него лишнее...
Т.е. возможно всё-таки планировалось повырезать лишнее, вот я и решил уточнить этот момент.
Ошибочное определение дропов настраивается параметрами min_move и max_stop (пкс). Первый параметр - минимальное движение в кадре, которое еще распознается за движение, второй - максимальное движение в кадре, который признается дропом при наличии рядом кадров с движением, быстрее текущего в move_idx раз.
Спасибо, в случае чего - теперь буду знать что попробовать подкрутить.
Но обе претензии несущественны, т.к. первая неожиданно сокращает количество даже такого большого количества рядом расположенных дропов, а вторая частично ловит и заменяет смешанные кадры из двух соседних, частично ловит приостановки проводки камеры оператором в обоих случаях сглаживая рывки и опять же делая видео плавнее.
Да, согласен, такое несущественно. Меня лично больше волнуют не определившиеся пропущенные дропы, если таковые будут, но думаю теперь всё будет проще, когда известно какие параметры настраивать. При пользовании DoubleDropFix.avs (второй версии), именно с такой проблемой я столкнулся на той серии сериала, что я приводил ссылку на рутрекер чуть выше (после удаления циклических дублей, там оставались местами единичные дропы, но сильные артефакты сжатия похоже помешали нормальному детекту дропов (соседние одинаковые кадры отличались только сильными артефактами сжатия и видимо распознались как движение)
Bars
Вырежем. Не всё сразу
Перед вырезанием надо сперва определиться, что оставить. Может так случиться, что все 8 вариантов замены дропов востребованы для вашего видео.
Vivian
с помощью чего Вы делали статистику дропов в видео?
С помощью скрипта выводил статистику в текстовый файл и анализировал в MS Excel.
Не можете поделиться скриптом, чтобы можно было бы узнать, насколько хорошо (без дублей, дропов) захватывается видео?
Vivian
Скрипт не сохранился. Он делается на основе текущего скрипта DropFix. На досуге поэкспериментирую с ним и сообщу, что где дописывать.
Мне почему-то казалось, что один из алгоритмов исправления-это сблендить вместе кадры до и после дропа.
crystallize
сблендить вместе кадры до и после дропа
поможет, если движение в кадре в пределах нескольких пикселов, либо картинка уже размыта. Но если кадры четкие и движения существенны, то смешивание даст двойные контуры, потерю резкости, а эффект неравномерного движения в месте выпавшего кадра сохранится.
MAG79
поможет, если движение в кадре в пределах нескольких пикселов, либо картинка уже размыта. Но если кадры четкие и движения существенны, то смешивание даст двойные контуры, потерю резкости, а эффект неравномерного движения в месте выпавшего кадра сохранится.
Когда я обрабатываю видео ДропФиксом, то он начинает просто смешивать кадры, если два кадра по разные стороны от дропа слишком различны.
Может, вам будет интересно повозиться с этим файлом: http://gfile.ru/a5Udv. В противовес 60fps трейлеру Battlefield 3.
crystallize
Файл скачал. Покручу. На первый взгляд вижу, что это компьютерная анимация из какой-то игры. Достаточно "пикселизованная". Скрипт опирается на условие равномерности движений, и исходя из этого принимает решение о наличии выпавшего кадра и необходимости его замены из прошлого или из будущего для достижения максимальной плавности. В компьютерном исходнике изначально могли быть неравномерности движений из-за несовершенной анимации персонажей.
Покадрово буду смотреть завтра.
Я забыл добавить, что в оригинале было 30 fps, но покадрово было видно, что реальных там 15+дропы. А ещё после извлечения из образа диска видно, что файл датирован 1681 годом, и этим он крашит Вегас 7, в котором SQL рассчитан на 1751...9999 годы.
Анимация везде плавная настолько, насколько 15 fps могут это показать. Потому что при дропах замирают не только персонажи, но и камера.
crystallize
Файлик покрутил покадрово в редакторе avsPmod.
Смешивание можно настроить, для этого найти строку:
smoothfps_params="{rate:{num:12,den:1},algo:13, scene:{blend:true}}"
1. Устранить смешивание на похожих кадрах: заменить SVP-шейдер с 13-го на 2-ой:
smoothfps_params="{rate:{num:12,den:1},algo:2, scene:{blend:true}}"
2. Отодвинуть порог похожести кадров в сторону увеличения различий для более редкого срабатывания смены сцен (по-умолчанию 4000, значения 5000 и более уменьшают чувствительность смены сцен,
smoothfps_params="{rate:{num:12,den:1},algo:2, scene:{blend:true, mode:1, limits:{scene:5000}}}"
3. На сменах сцен перейти от смешивания к повторению ближайшего кадра (возвращает дропы на сменах сцен и кадрах с очень быстрыми движенями, нерекомендуется):
smoothfps_params="{rate:{num:12,den:1},algo:2, scene:{blend:false, mode:1, limits:{scene:5000}}}"
Ну и для более качественного определения движения при анализе и правильной замены пропущенных кадров было бы полезным отрезать черные полосы, которые в данном видео для разных сцен разные. Самое простое - это разбивать видео на куски и отрезать черные бордюры индивидуально.
Посложнее, но в один проход - это дописывать скрипт, где добавить отрезание полей перед обработкой и приклеивание их обратно после обработки. Размеры полей проставить во внешнем файле, используя диапазоны номеров кадров и функцию ConditionalReader.
Спасибо большое, теперь скрипт можно будет использовать как инструмент.
MAG79
Посложнее, но в один проход - это дописывать скрипт, где добавить отрезание полей перед обработкой и приклеивание их обратно после обработки. Размеры полей проставить во внешнем файле, используя диапазоны номеров кадров и функцию ConditionalReader.
Не, это без меня. Я лучше в Вегасе, он мне как родной, хоть и со своими глюками и тормозами из ничего.
MAG79, давно хотел поблагодарить вас за gamedropfix, я счас делаю что-то типо видео сборников всяких единоборств, есть китайские исходники в виде рипов с частотой 29.970 кадров, в виде блендов, т.к интерлейс там такой что его плавно хрен уберёшь, более менее приемлемый результат получается с QTGMC+SRestore, ито с пробуксовками на выходе, тогда-то ваш GameDropFix_v4 просто спасает видео от рывков, а если же исходник уже 29.970 с кривым деинтерлейсом, а ими являются примерно 70% старых китайских рипов, когда о никаких "TVITC, QTGMC, SRestore" в помине не знали, в таких случаях GameDropFix очень сильно повышает плавность видео(предварительно более менее корректно перегнав его в 23.976 либо в 25 fps, в зависимости от исходника) избавляя от назойливой части дропов/рывков, а какие-то остаются, но они уже абсолютно не раздражают при просмотре.
Кстати, такие старые китайские рипы попадались, что у них даже тройные дропы бывали.
По умолчанию "подавление артефактов не включено", но оно очень сильно помогает уменьшить видимость артефактов практически на нет, т.к кадры в основном интерполируются либо по 1 либо по 2-м, но в плохих исходниках даже после ихней чистки от блочности и прочего по самое горло, тоже не всегда помогает более точной интерполяции даже единичных кадров, а вот подавление площадных - очень даже помогает, в разумных пределах.
Мне этого хватило вполне, больше не вижу смысла ставить.
mask:{area:100,cover:80}
Ghostlamer
Спасибо, полезное наблюдение.
Тут недавно наткнулся на Dup, может быть кому-нибудь будет интересно как альтернатива. Лучше это или хуже не скажу.
ув. MAG79, по скрипту GameDropFix_v4 - у меня проц 0.7 по рейтингу свп, но видеок. HD5750 по индикатору AMD System Monitor совсем не загружена - меньше 2%, и не во время просмотра, хотя галка gpu стоит в меню svp, я в основном озабочен только кодированием видео с помощью svp, мне приходится время от времени склеивать видео с разных фотоаппаратов, часто это HD видео, но что бы пристыковать к нему что-то от веб камеры с минимумом перекодировок, мне приходится поднимать фпс. я перепробовал несколько фильтров, но svp лучший из известных мне. я новичёк а ависинте, но с объектным программированием знаком. извините за долгое вступление, вот вопрос:
ависинт пишет прямо в окне видео, что весьма мешает:
I don't kno what "fix_clip" means ([ScriptClip]. line 2)
я посмотрел код скрипта по-подробнее, и насколько смог понять там какая-то рекурсия, когда переменной присваивается результат функции, в определении которой она же и использована. я не силен в алгоритмах для прохода по кадру, и разобраться в вашем коде мне правда тяжело. направьте как-то на путь истинный, подскажите, в чем дело?
подскажите еще пожалуйста, как можно увидеть эффективность этого скрипта, или как исследовать видео на предмет необходимости этого скрипта, вы такие графики рисовали...
mask:{area:100,cover:80}
подскажите пожалуйста, где это использовать?
SmoothVideo Project → Эксплуатация SVP → Замена выпавших кадров (drop'ов) и SVP
Powered by PunBB, supported by Informer Technologies, Inc.