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

Bars
скачок, потом дроп
Да

для данного случая более высокая плавность будет достигнута за счет фикса обратных дропов
Да

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

MAG79
Да
А какие тогда недостатки (в плане качества, а не скорости) имеет GameDropFix_v3 в сравнении с DoubleDropFix_v3? (если применять для кино продукции, а не для игрового видео)
Если интересует качество, то вроде как получается, что GameDropFix_v3 лучше и универсальнее (разве что может у него другие настройки чувствительности определения дропов, либо какие-то другие параметры настроенные под игровое видео?).

P.S. А раз анализ движения уже реализован в GameDropFix_v3 может можно его тогда добавить и в DoubleDropFix_v4? (если не сложно)

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

Таблица сравнения этих двух скриптов.

http://www.svp-team.com/forum/misc.php?item=2840

какие тогда недостатки (в плане качества, а не скорости) имеет GameDropFix_v3
Излишняя сложность и лишние варианты обработки двойных и тройных дропов, которые обычно не встречаются в кино/видео записях.

Если интересует качество, то вроде как получается, что GameDropFix_v3 лучше и универсальнее
Да. Качество интерполяции выше, качество идентификации дропов выше. Вариантов замены больше. Это приводит к лучшей плавности на выходе.

какие-то другие параметры настроенные под игровое видео?
Текущее ограничение: скрипт настроен для видео с разрешением 1280x720 и частоты 60 к/сек. Под видео другого характера возможны ошибки из-за некратности сторон видео блокам 32x32 и может потребоваться перенастройка параметров, отвечающих за граничные значения обнаружения движений.

раз анализ движения уже реализован в GameDropFix_v3 может можно его тогда добавить и в DoubleDropFix_v4?
Проще взять GameDropFix, повырезать из него лишее и настроить под конкретный видеофайл. Если еще проще: то только настроить, ничего не вырезая.

Post's attachments

DoubleDropFix_vs_GameDropFix.png, 9.78 kb, 499 x 380
DoubleDropFix_vs_GameDropFix.png 9.78 kb, 798 downloads since 2013-10-23 

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

MAG79
Таблица сравнения этих двух скриптов.
Спасибо, отличная табличка, теперь все хорошо видно (в таблице, кстати в паре мест лишняя единичка закралась и получилось Fix133 вместо Fix33)
Преимуществ у игрового скрипта действительно много, даже для фикса двойных дублей вариант -Fix50&Fix50 гораздо интереснее, чем Fix33&Fix66

Качество интерполяции выше, качество идентификации дропов выше. Вариантов замены больше. Это приводит к лучшей плавности на выходе.
Мне все больше хочется перейти на использование игрового скрипта smile
Вот только:
Текущее ограничение: скрипт настроен для видео с разрешением 1280x720 и частоты 60 к/сек. Под видео другого характера возможны ошибки из-за некратности сторон видео блокам 32x32 и может потребоваться перенастройка параметров, отвечающих за граничные значения обнаружения движений.
А это ограничение можно убрать? Снизить кратность, например, до 4x4 (я в лучшем случае встречаю кратность 16x16, а уж 32x32 вообще почти никогда не попадается) и т.д., т.е. сделать более универсальным? (DoubleDropFix был в принципе достаточно универсален и подходил практически для любого видео)

Проще взять GameDropFix, повырезать из него лишнее и настроить под конкретный видеофайл.
Это один раз настройка под конкретный видеофайл или под другие потом тоже что-то перенастраивать надо будет? Хотелось бы что-то универсальное, чтобы с любым видеофайлом хорошо работало.
Поможете с этой задачей? (из видеоматериала с дропами, кроме семпла выше и этой серии сериала, имеющей кроме циклических дублей, ещё и кучу дропов с различным скачками)

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

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

Bars
в таблице, кстати в паре мест лишняя единичка закралась и получилось Fix133 вместо Fix33
Единичка на своем месте. Это я привел разные системы обозначения к одному виду: положение кадра относительно текущего места с точки зрения скрипта.
Допустим, человек знает, что два кадра выпали. Он ассоциирует кадр перед дропом и две его копии как одно и то же и для него 33% и 66% - понятное обозначение двух положений между этим кадром и следующим.
Скрипт работает иначе: он должен заменить текущий выпавший кадр на интерполированный. Для первого пропущенного кадра его замена расположена в промежутке через кадр вперед на отметке 133%, а для второго выпавшего кадра промежуток берется тот же, но он раположен уже на кадр ближе, поэтому расстояние до него 66%.

некратности сторон видео блокам 32x32... ограничение можно убрать?
Можно.

Это один раз настройка под конкретный видеофайл или под другие потом тоже что-то перенастраивать надо будет?
Для начала - под конкретный файл. А дальше с каждой правкой скрипт будет все универсальней. Сразу всего не учтешь wink

Если не вырезать лишнее, то как я понимаю это скажется на скорости работы скрипта из-за лишней бесполезной нагрузки?
Да.

Поможете с этой задачей?
На сэмпле можно попробовать. Но у меня встречный вопрос: неужели нет более качественной копии этого фильма на DVD/VHS/еще где-либо без выпавших кадров?

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

MAG79
Для начала - под конкретный файл. А дальше с каждой правкой скрипт будет все универсальней. Сразу всего не учтешь
ОК, "кривой" видеоматериал мне попадается относительно часто, так что будет на чём экспериментировать.

На сэмпле можно попробовать.
Отлично, буду ждать!

Но у меня встречный вопрос: неужели нет более качественной копии этого фильма на DVD/VHS/еще где-либо без выпавших кадров?
Я всегда стараюсь найти самое наилучшее качество (Blu-ray,HDTV,DVD9,DVD5), а  когда исходников не найти, нахожу и скачиваю все возможные варианты рипов, чтобы выбрать наилучший (по всем параметрам). Но иногда (преимущественно для редких фильмов и сериалов до 2000-х годов) выбирать просто не из чего (ни на закрытых трекерах, ни в др.местах, типа usenet), есть только один кривой рип с дропами. Без альтернатив. Разумеется, заниматься перекодировкой с фиксом дропов - это самая крайняя мера, т.к. просто нет другого выбора.

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

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

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

MAG79
Адаптировал скрипт GameDropFix
Шикарно, спасибо! Завтра приступлю к тестированию (и в дальнейшем буду применять для всего материала с дропами), если найду какие-то недочёты - отпишусь здесь.

под любой размер кадра, а не только 1280x720, убрал необходмость кратности сторон кадра блокам 32x32.
Не упомянули про выбрасывание из скрипта лишнего, ненужного для обработки неигрового видео, чтобы улучшить быстродействие - не выбрасывали лишнее?

На сэмпле работает почти идеально.
А чего именно до идеала не хватает?

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

Bars
выбрасывание из скрипта лишнего, ненужного для обработки неигрового видео, чтобы улучшить быстродействие - не выбрасывали лишнее?
В скрипте GameDropFix_v4 сохранены все 8 вариантов замены одиночных, двойных и тройных дропов. Функциональность из скрипта не удалялась. Быстродействие не замерял, но вполне приемлемое. Тут уж либо быстродействие, либо универсальность. wink

чего именно до идеала не хватает?
"человечности" smile
Идеалом я считаю обработку каждого дропа с нулевым количеством ошибочно определившихся дропов. Сейчас скрипт удовлетворяет меня только на 99% wink
В 1% случаев скрипт ошибается.
Но для алгоритмов такого рода, где условия поиска и замены дропов сложно-формализуемы, невозможно добиться идеала. К нему можно только стремиться.

Для этого в скрипте предусмотрены настраиваемые параметры.

Конкретно этот алгоритм на конкретно этом сэмпле не пропустил ни одного дропа, но при этом:
- заменил дропы в длинной последовательности дропов (я такой логики вроде-бы в него не закладывал): кадры 1, 44
- ошибочно посчитал кадры с наличием минимального движения за дроп: кадр 75, 232, 323, 410, 411, 464, 473, 879, 990, 1148, 1160, 1236, 1253, 1281, 1460
Можно проверить самостоятельно в любом редакторе, например в AvsPmod, добавив в конец строку:

StackVertical(src,last)

Но обе претензии несущественны, т.к. первая неожиданно wink сокращает количество даже такого большого числа рядом расположенных дропов, а вторая частично ловит и заменяет смешанные кадры из двух соседних, частично ловит приостановки проводки камеры оператором, в обоих случаях сглаживая рывки и опять же делая видео плавнее. Причем на таких небольших интенсивностях движений на вставленных интерполированных кадрах артефакты в исчерпывающем большинстве случаев отсутствуют. С учетом этого уточнения выходит, что скрипт на этом сэмпле отработал идеально. cool

Ошибочное определение дропов настраивается параметрами min_move и max_stop (пкс). Первый параметр - минимальное движение в кадре, которое еще распознается за движение, второй - максимальное движение в кадре, который признается дропом при наличии рядом кадров с движением, быстрее текущего в move_idx раз.

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

MAG79
В скрипте GameDropFix_v4 сохранены все 8 вариантов замены одиночных, двойных и тройных дропов. Функциональность из скрипта не удалялась. Быстродействие не замерял, но вполне приемлемое. Тут уж либо быстродействие, либо универсальность
Ну просто чуть выше писали:

MAG79 wrote:

Проще взять GameDropFix, повырезать из него лишнее...

Т.е. возможно всё-таки планировалось повырезать лишнее, вот я и решил уточнить этот момент.

Ошибочное определение дропов настраивается параметрами min_move и max_stop (пкс). Первый параметр - минимальное движение в кадре, которое еще распознается за движение, второй - максимальное движение в кадре, который признается дропом при наличии рядом кадров с движением, быстрее текущего в move_idx раз.
Спасибо, в случае чего - теперь буду знать что попробовать подкрутить.

Но обе претензии несущественны, т.к. первая неожиданно  сокращает количество даже такого большого количества рядом расположенных дропов, а вторая частично ловит и заменяет смешанные кадры из двух соседних, частично ловит приостановки проводки камеры оператором в обоих случаях сглаживая рывки и опять же делая видео плавнее.
Да, согласен, такое несущественно. Меня лично больше волнуют не определившиеся пропущенные дропы, если таковые будут, но думаю теперь всё будет проще, когда известно какие параметры настраивать. При пользовании DoubleDropFix.avs (второй версии), именно с такой проблемой я столкнулся на той серии сериала, что я приводил ссылку на рутрекер чуть выше (после удаления циклических дублей, там оставались местами единичные дропы, но сильные артефакты сжатия похоже помешали нормальному детекту дропов (соседние одинаковые кадры отличались только сильными артефактами сжатия и видимо распознались как движение)

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

Bars
Вырежем. Не всё сразу wink
Перед вырезанием надо сперва определиться, что оставить. Может так случиться, что все 8 вариантов замены дропов востребованы для вашего видео.

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

MAG79 wrote:

Vivian
с помощью чего Вы делали статистику дропов в видео?
С помощью скрипта выводил статистику в текстовый файл и анализировал в MS Excel.

Не можете поделиться скриптом, чтобы можно было бы узнать, насколько хорошо (без дублей, дропов) захватывается видео?

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

Vivian
Скрипт не сохранился. Он делается на основе текущего скрипта DropFix. На досуге поэкспериментирую с ним и сообщу, что где дописывать.

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

Мне почему-то казалось, что один из алгоритмов исправления-это сблендить вместе кадры до и после дропа. smile

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

crystallize
сблендить вместе кадры до и после дропа
поможет, если движение в кадре в пределах нескольких пикселов, либо картинка уже размыта. Но если кадры четкие и движения существенны, то смешивание даст двойные контуры, потерю резкости, а эффект неравномерного движения в месте выпавшего кадра сохранится.

66 (edited by crystallize 08-03-2014 11:57:34)

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

MAG79
поможет, если движение в кадре в пределах нескольких пикселов, либо картинка уже размыта. Но если кадры четкие и движения существенны, то смешивание даст двойные контуры, потерю резкости, а эффект неравномерного движения в месте выпавшего кадра сохранится.

Когда я обрабатываю видео ДропФиксом, то он начинает просто смешивать кадры, если два кадра по разные стороны от дропа слишком различны.
Может, вам будет интересно повозиться с этим файлом: http://gfile.ru/a5Udv. В противовес 60fps трейлеру Battlefield 3. smile

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

crystallize
Файл скачал. Покручу. На первый взгляд вижу, что это компьютерная анимация из какой-то игры. Достаточно "пикселизованная". Скрипт опирается на условие равномерности движений, и исходя из этого принимает решение о наличии выпавшего кадра и необходимости его замены из прошлого или из будущего для достижения максимальной плавности. В компьютерном исходнике изначально могли быть неравномерности движений из-за несовершенной анимации персонажей.
Покадрово буду смотреть завтра.

68 (edited by crystallize 08-03-2014 16:41:18)

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

Я забыл добавить, что в оригинале было 30 fps, но покадрово было видно, что реальных там 15+дропы. А ещё после извлечения из образа диска видно, что файл датирован 1681 годом, и этим он крашит Вегас 7, в котором SQL рассчитан на 1751...9999 годы. smile
Анимация везде плавная настолько, насколько 15 fps могут это показать. Потому что при дропах замирают не только персонажи, но и камера.

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

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 и более уменьшают чувствительность смены сцен,

при 10000 я вообще не нашел ни одного смешанного кадра и пропущенного дропа
):

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.

70 (edited by crystallize 14-03-2014 14:53:17)

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

Спасибо большое, теперь скрипт можно будет использовать как инструмент. smile
MAG79
Посложнее, но в один проход - это дописывать скрипт, где добавить отрезание полей перед обработкой и приклеивание их обратно после обработки. Размеры полей проставить во внешнем файле, используя диапазоны номеров кадров и функцию ConditionalReader.

Не, это без меня. Я лучше в Вегасе, он мне как родной, хоть и со своими глюками и тормозами из ничего. smile

А где на практике применяется ConditionalReader? Если бы не вы, я по описанию и не догадался бы, что он имеет какое-то отношение к нелинейному монтажу черерз скрипты.

71 (edited by Ghostlamer 16-03-2014 15:42:05)

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

MAG79, давно хотел поблагодарить вас за gamedropfix, я счас делаю что-то типо видео сборников всяких единоборств, есть китайские исходники в виде рипов с частотой 29.970 кадров, в виде блендов, т.к интерлейс там такой что его плавно хрен уберёшь, более менее приемлемый результат получается с QTGMC+SRestore, ито с пробуксовками на выходе, тогда-то ваш GameDropFix_v4 просто спасает видео от рывков, а если же исходник уже 29.970 с кривым деинтерлейсом, а ими являются примерно 70% старых китайских рипов, когда о никаких "TVITC, QTGMC, SRestore" в помине не знали, в таких случаях GameDropFix очень сильно повышает плавность видео(предварительно более менее корректно перегнав его в 23.976 либо в 25 fps, в зависимости от исходника) избавляя от назойливой части дропов/рывков, а какие-то остаются, но они уже абсолютно не раздражают при просмотре.
Кстати, такие старые китайские рипы попадались, что у них даже тройные дропы бывали. big_smile
По умолчанию "подавление артефактов не включено", но оно очень сильно помогает уменьшить видимость артефактов практически на нет, т.к кадры в основном интерполируются либо по 1 либо по 2-м, но в плохих исходниках даже после ихней чистки от блочности и прочего по самое горло, тоже не всегда помогает более точной интерполяции даже единичных кадров, а вот подавление площадных - очень даже помогает, в разумных пределах. smile
Мне этого хватило вполне, больше не вижу смысла ставить.

mask:{area:100,cover:80}

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

Ghostlamer
Спасибо, полезное наблюдение. smile

73 (edited by NightFox 31-03-2014 13:42:40)

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

Тут недавно наткнулся на Dup, может быть кому-нибудь будет интересно как альтернатива. Лучше это или хуже не скажу.

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

ув. 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)

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

подскажите еще пожалуйста, как можно увидеть эффективность этого скрипта, или как исследовать видео на предмет необходимости этого скрипта, вы такие графики рисовали...

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

Ghostlamer wrote:
mask:{area:100,cover:80}

подскажите пожалуйста, где это использовать?