|
Mikky72
Стаж: 17 лет 9 месяцев Сообщений: 8498
|
Mikky72 ·
14-Май-13 23:04
(11 лет 7 месяцев назад, ред. 23-Май-13 00:08)
Тема была выделена из Создание видеодорожки для DVD (mpeg2) из прогрессивного HD-источника (h264) и сопутствующие моменты Mikky72
Тут будет инструкция... возможно...
До обсуждения скриптов (конкретных реализаций) надо обсудить общие схемы процесса
Что понимается в данном случае под интелейсным исходником? Дословно интерлейсинг - это переплетение. Кадр видео представляет из себя переплетение четных и нечетных строк. В данном топике обсуждается переплетение в одном кадре строк, которые соответствуют изображению объекта в различные моменты времени. Схема 1. Интерлейсный исходник с телесиномПодробнее о телесине (телекино преобразование) Телекино, Telecine
Для кодирования лучше провести обратное телекино-преобразование, что превратит интерлейсный источник в прогрессивное видео.
1. Декодирование
2. Обратный телесин
3. Конверсия цветового пространства
4. Ресайз
5. Частота кадров NTSC_film или PAL
6. Смена матрицы цветовых коэффициентов Схема 2. Интерлейсный исходник с "перепутанными полями"С какой-то слишком глубоко законспирированной целью четные строки одного кадра оказываются приписаны не ему, а соседнему. Лучше всё вернуть на свои места и восстановить прогрессивное видео.
1. Декодирование
2. Подбор правильных пар полей для формирования прогрессивных кадров (Telecide)
3. Конверсия цветового пространства
4. Ресайз
5. Частота кадров NTSC_film или PAL
6. Смена матрицы цветовых коэффициентов Схема 3. Интерлейсный исходник с временным сдвигом между полями (честный интерлейс)Захотели (или из-за неких технических ограничений были вынуждены) снимать видео с частотой кадров в 2 раза больше, но в половинном разрешении. А при объединении двух таких "полукадров" в один и одновременном их отображении видим "гребенку". Тут в интересах более качественной передачи движения чаще всего стараются данный принцип перенести и на DVD. Главная проблема - грамотно понизить разрешение.
1. Декодирование
2. Деинтерлейс с удвоением частоты кадров и компенсацией движения (для восстановления недостающих строк информация берется из соседнего кадра, но сдвигается по горизонтали, компенсируя движение объекта)
3. Какой-то "антиалиасинг" для устранения остаточной неровности контуров
4. Конверсия цветового пространства
5. Ресайз до SD по высоте
6. Какая-то доп. фильтрация ???
7. Разложение каждого кадра на поля.
8. Выкидывание каждого 2 и 3-го полей из 4-х
9. Совмещение оставшихся полей в единые кадры "с гребенкой"
10. Частота кадров
11. Смена матрицы цветовых коэффициентов
|
|
tartak
Стаж: 18 лет 9 месяцев Сообщений: 2548
|
tartak ·
20-Май-13 10:23
(спустя 5 дней)
Почти наверняка тут это где-то проскакивало, но найти не могу (разучился, а точнее избаловался возможностями модера). Итак, интерлейсный HD в SD. Попробуем сначала начать, со всеми подробностями и объяснениями, ничего не беря на веру. Если получится разумная дискуссия, потом Микки сможет ее отделить в отдельную тему или включить в инструкцию, изменив заголовок.
Итак, в качестве затравки, несколько общих соображений.
1) Размер интерлейсного видео нельзя менять напрямую. Изображение будет двоиться, появится мерцание, поскольку линии в полях окажутся смещены и т.д. Даже если разделить на поля, уменьшить размер каждого поля, а потом соединить опять, все равно будет полная фигня. Желательно: написать лучшее объяснение сути проблемы и приложить картинки с наглядными примерами фигни.
2) Есть огромные комбайны типа hd2sd. Он много чего делает, но выбор конкретных методов для каждого шага никак не объяснен и сплошь и рядом сомнителен. Лучше проще, но лучше Или хотя бы понятней, чтобы знать, где собака порылась, когда что-то не срабатывает.
3) Общая идея - делать деинтерлейс, потом ресайз, потом снова интерлейс (или уж так и оставить в прогрессиве, смотря что хотим). Открывается огромное поле для деятельности. Как лучше делать деинтерлейс (и есть ли хоть какая-то нужда в качественных деинтерлейсорах для нашей конечной цели)? Что делать с мерцанием? Стоит ли добиваться резкости (то, что хорошо выглядит на скриншоте, может выглядеть вовсе не так хорошо при просмотре), как ставить высокочастотный фильтр (по вертикали, по горизонтали). Ну и общие вопросы, ресайзеры, деблокеры (стоит ли доверять эту задачу декодеру?)
Простенький скрипт (на основе скрипта Gavino)
Код:
DGSource("hd.dgi") #замените на ваш любимый декодер NewHeight = 480
NewWidth = 720 AssumeTFF() # TTF или BFF, это нужно вручную выбирать
#AssumeBFF() SeparateFields() Shift = (GetParity() ? -0.25 : 0.25) * (Height()/Float(NewHeight/2) - 1.0) E = SelectEven(). BicubicResize(NewWidth, NewHeight/2, 0, 0.5, 0, Shift)
O = SelectOdd(). BicubicResize(NewWidth, NewHeight/2, 0, 0.5, 0, -Shift)
Ec = SelectEven(). BicubicResize(NewWidth, NewHeight/2, 0, 0.5, 0, 2*Shift)
Oc = SelectOdd(). BicubicResize(NewWidth, NewHeight/2, 0, 0.5, 0, -2*shift) Interleave(E, O)
IsYV12() ? MergeChroma(Interleave(Ec, Oc)) : Last
Weave() AutoYUY2()
ColorMatrix(mode="Rec.709->Rec.601", inputFR=true, outputFR = false, clamp=0)
Характерно, что мы тут делаем простейший "боб" деинтерлейс, но, скорей всего, его должно быть с головой достаточно (или нет?). В отличие от встроенной функции bob (и, возможно, большинства деинтерлейсеров), обработка цветности делается правильно. Разумеется, никакой высокочастотной фильтрации и проч., скрипт приведен просто чтобы начать дискуссию.
|
|
Mikky72
Стаж: 17 лет 9 месяцев Сообщений: 8498
|
Mikky72 ·
20-Май-13 13:03
(спустя 2 часа 40 мин., ред. 20-Май-13 13:03)
ARARAND писал(а):
30259972
Скрипт для интерлейса, вероятно, с ошибками
import("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\functions\AudioFunctions.avs")
import("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\functions\VideoFunctions.avs")
loadplugin("C:\Program Files\Winnydows\XviD4PSP5\apps\DGMPGDec\DGDecode.dll")
loadplugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\NicAudio.dll") video = MPEG2Source("D:\K_A_M_E_R_A\Kiril Lavrov - s`emka s vodi\VIDEO\KiriL_Lavrov - s_vodi_(Progressive)_01.index\KiriL_Lavrov - s_vodi_(Progressive)_01.d2v",cpu=0,info=3)
audio = NicMPG123Source("D:\K_A_M_E_R_A\Kiril Lavrov - s`emka s vodi\VIDEO\KiriL_Lavrov - s_vodi_(Progressive)_01.index\KiriL_Lavrov - s_vodi_(Progressive)_01 PID 814 L2 2ch 48 384 DELAY 0ms.mpa")
AudioDub(video, audio) AmplifydB(9.429)
AutoYV12() #plugin_files
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\ColorMatrix.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\LeakKernelDeint.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\Depan.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\DepanEstimate.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\degrainmedian.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\fft3dgpu.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\RemoveGrainSSE3.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\RepairSSE3.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\mvtools2.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\MaskTools.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\MT.dll")
LoadPlugin("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\mt_masktools-25.dll")
Import("C:\Program Files\Winnydows\XviD4PSP5\dlls\AviSynth\plugins\minblur.avs") ConvertToYV12(interlaced=true)
LeakKernelBob(order=1, threshold=7) spline64resize(720,576) setmtmode(2)
source= last.trim(6,0)
W = 720
H = 576
#STABILIZING
stab_reference= source.crop(10,6,-10,-6).tweak(cont=1.05,sat=1.3).binarize(threshold=80).greyscale().invert() mdata=DePanEstimate(stab_reference,trust=1.0,dxmax=10,dymax=6)
stab=DePanStabilize(source,data=mdata,cutoff=2.0,dxmax=10,dymax=6,pixaspect=1.094,mirror=15) # or pixaspect=0.911 for NTSC
stab2= stab.crop(18,10,-18,-10) source2 = stab2.degrainmedian(mode=2,limity=4,limituv=5) super = source2.MSuper(pel=2, sharp=2, rfilter=2)
b1v = MAnalyse(super,isb=true, delta=1, blksize=16, overlap=4, truemotion=true)
f1v = MAnalyse(super,isb=false,delta=1, blksize=16, overlap=4, truemotion=true)
cf1 = MCompensate(source2, super, f1v, planar=true)
cb1 = MCompensate(source2, super, b1v, planar=true)
inter = interleave(cf1, source2.MDegrain1(super,b1v,f1v, planar=true), cb1)
#mvden = inter.Temporalsoften(1,4,8,15,2) # для исходников с малым шумом
mvden = inter.fft3dgpu(wintype=1,degrid=1,bw=24,bh=24,ow=12,oh=12,bt=3,sigma=2.75,sigma2=1.8,sigma3=2.2,sigma4=2.5,plane=0,interlaced=true)
den = mvden.selectevery(3,1) s = den.minblur(1,1)
allD = mt_makediff(source2,den)
ssD = mt_makediff(s,s.removegrain(11,-1))
ssDD = ssD.repair(allD,1)
ssDD = ssDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?")
den.mt_adddiff(ssDD,U=2,V=2)
coloryuv(off_U=-0,off_V=-0).levels(0,0.97,255,0,255).spline36resize(W,H)
DoubleWeave().SelectEvery(4,1)
#AssumeTFF().SeparateFields().Weave()
ColorMatrix(mode="Rec.709->Rec.601", inputFR=false, clamp=0,interlaced=true)
ConvertToYUY2(interlaced=true) # Назначение: для качественной обработки материала HDV для DVD с частичной стабилизацией изображения и сохранением интерлейса
# Тип предварительного шумоподавителя: degrainmedian
# Тип основного шумоподавителя: на основе векторного анализа оценки движения с заключительным шумоподавителем Temporalsoften или fft3dfilter
# Тип сглаживателя: отсутствует
# Тип шарпера: ContraSharpening
# Скорость обработки: медленная
# Предупреждение: деинтерлейс в программе XviD 4PSP 5.0 НЕ ПОДКЛЮЧАТЬ!!!! Lanczos4Resize(720, 440)
AddBorders(0, 68, 0, 68)
А вот eщё для "честного" интерлейса https://rutr.life/forum/viewtopic.php?p=26347729#26347729
Как один из вариантов (HDTV->DVD) для фильма ПИДЖАК:
скрытый текст
LoadPlugin("C:\Program Files (x86)\Dgmpgdec\DGDecode.dll")
Mpeg2source("Pidjak.d2v", cpu=2)
LoadPlugin ("C:\Program Files (x86)\TIVTC\TIVTC.dll")
TFM().TDecimate() # Устранение телесина (восстановление прогрессивных кадров фильма)
ConvertToYV24(chromaresample="point") # Для последующего нечетного кропа"
Crop(1,4,-3,0)
LoadPlugin("C:\Program Files (x86)\AutoYUY2\AutoYUY2.dll")
AutoYUY2()
BicubicResize(720, 480, 0, 0.5)
AssumeFPS ("ntsc_film")
Надо ли делать смену матрицы, если исходник HDTV mpeg2?
|
|
Tempter57
Стаж: 16 лет 2 месяца Сообщений: 4963
|
Tempter57 ·
20-Май-13 13:42
(спустя 38 мин., ред. 21-Май-13 15:55)
Mikky72
Для третьего случая я в своё время включил в состав конвертера пресет HDV_DVD QTGMC и, мы с tartak в своё время много обсуждали преобразование интерлейсного HDV в DV и DVD.
скрытый текст
#avstp.dll
#RemoveGrainSSE2.dll
#RepairSSE2.dll
#ColorMatrix.dll
#mvtools2mod.dll
#nnedi3.dll
#AutoYUY2.dll
#AddGrainC.dll
#VerticalCleaner.dll
#mt_masktools-26.dll
#flash3kyuu_deband.dll
#unfilter.dll
#GradFun2DB.dll
#QTGMC.avs
#YV12ToYUY2imod.avs # setmemorymax(1024) AssumeTFF()
Bicubicresize(720, Last.Height, -0.8, 0.6) QTGMC( "Fast", TR0=1,TR1=1,TR2=1, NNeurons=1, SubPelInterp=1, Sharpness=0, Edithreads=0 ) BicubicResize(Last.Width, 576, -0.8, 0.6) # for PAL
# BicubicResize(Last.Width, 480, -0.8, 0.6) # for NTSC QTGMC( "Slow", TR2=1, InputType=1, Edithreads=0 ) blur(0,1).sharpen(0,0.51).blur(0,1).sharpen(0,0.85) # ==== DeBanding ====
f3kdb(sample_mode=2,dynamic_grain=true,keep_tv_range=false,dither_algo=3,y=64,cb=40,cr=40,grainY=0,grainC=0) #ColorMatrix(mode="Rec.709->Rec.601", inputFR=true, clamp=0) # for DV by Cedocida
ColorMatrix(mode="Rec.709->Rec.601", clamp=0) # for DVD AutoYUY2()
AssumeTFF().SeparateFields().SelectEvery(4, 0, 3).Weave()
# YV12ToYUY2imod()
Можно, думаю, здесь выполнить обработку и по-проще да и интерлейс более скоростной, хотя бы peset="Very Fast", а в обработке применить пресет с частичным возвратом зерна и шума
QTGMC( Preset="Slow", InputType=1, NoiseProcess=2, GrainRestore=0.3, NoiseRestore=0.2, Edithreads=0, Sigma=1.8, \
NoiseDeint="Generate", StabilizeNoise=true ) или иной для лёгкого шумоподавления:
скрытый текст
source = last.assumeframebased()
str = 0.8
dct = 0
chroma = true
blendv = mt_lut(source, Y=Round(str*255), U=-128,V=-128)
psuper = source.removegrain(11).MSuper(pel=2, sharp=1, rfilter=3, chroma=chroma)
ssuper = source.MSuper(pel=2, sharp=2, chroma=chroma, levels=1)
b1v = MAnalyse(psuper,isb=true, delta=1, blksize=16, overlap=8, truemotion=false, search=5, chroma=chroma, dct=dct)
f1v = MAnalyse(psuper,isb=false,delta=1, blksize=16, overlap=8, truemotion=false, search=5, chroma=chroma, dct=dct)
cf1 = MCompensate(source, ssuper, vf1, thSAD=150, thSCD1=200, thSCD2=80)
cb1 = MCompensate(source, ssuper, vb1, thSAD=150, thSCD1=200, thSCD2=80)
interleave(cb1, source.MDegrain1(ssuper, b1v,f1v,thSAD=90,thSCD1=150,thSCD2=80,limit=64,lsb=true).DitherPost(mode=6), cf1)
TemporalSoften(1,7,7,12,2)
selectevery(3,1)
mt_merge(last, source, blendv, luma=true) # SOFT SHARPENING
# HighPassSharp(r=0.15)
ContraHD(last,source,cb1,cf1,3)
f3kdb(sample_mode=2,dynamic_grain=true,keep_tv_range=false,dither_algo=3,y=52,cb=36,cr=36,grainY=0,grainC=0)
Скрипт, приведённый вами от ARARAND с частичной стабилизацией изображения и, думаю, он не подходит для данного случая, кроме того режим planar=true в векторном анализе игнорируется в цветом пространстве YV12.
Наиболее чаще применяется самый простой и быстрый скрипт с боб-деинтерлейсом без всякой обработки шумодавами:
скрытый текст
LoadPlugin("DGAVCDecode.dll")
LoadPlugin("LeakKernelDeint.dll")
LoadPlugin("AutoYUY2.dll")
LoadPlugin("ColorMatrix.dll") AVCSource("video.dga")
LeakKernelBob(order=1)# первое поле верхнее (TFF)
LanczosResize(720,576)# для PAL
# LanczosResize(720,480)# для NTSC AutoYUY2()
AssumeTFF().SeparateFields().SelectEvery(4, 0, 3).Weave()# на выходе TFF
#DoubleWeave().SelectEvery(4,1) # другой вариант
ColorMatrix(mode="Rec.709->Rec.601", inputFR=false, clamp=0,interlaced=true)
Упомянутый tartak HD2CD тоже есть в виде строки настроек:
Код:
hd2sd(interlaced = true, Interlaced_out = true, ScaleRGBInput = true
\ , ExpandRGB = true, ResizeSharper = true, OutputColorSpace = "YUY2"
\ , OutputBFF = true, Output601 = true, DeintMethod = 1, HQFiltering = true
\ , VerticalBlur = 0.7, Sharpness = 0.5, NR=7, OutputHeight = 576, SmoothTime = false
\ , OutputWidth = 720, OutputWidescreen = true, WidescreenType = 0, GrapesmootherAmount = 30)
Само собой надо подбирать значения, особенно VerticalBlur и Sharpness под исходник.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
20-Май-13 22:05
(спустя 8 часов)
tartak
Отдельно о ресайзе.
1. Если точнее о допустимости ресайза в чересстрочном видео, то категорически нельзя его делать только по вертикали. Поскольку горизонтальный и вертикальный ресайзеры в Ависинте совершенно разделены (как это ни странно), то в интересах ускорения работы деинтерлейсера (особенно если применяется скрипт вроде QTGMC), можно предварительно делать горизонтальный ресайз. На doom9 это когда-то обсуждалось, вроде, проблем не создаёт. 2. Тот скрипт ресайза на разделённых полях отрабатывался на doom9 в отношении ошибок вертикального рассовмещения (если не путаю, позже появилась дл-лка с этим же алгоритмом).
Но проблема не в точности устранения этой ошибки - это общая проблема ресайза на разделённых полях. На неподвижном изображении полной четкости нарушается условие теоремы отсчётов: в процессе ресайза оно представлено половиной нужного их числа. С визуальной точки зрения, часть элементов изображения, сдвигаемых при ресайзе, не может попасть в строку второго поля. В результате проиходит расслоение резких горизонтальных границ объектов в неподвижном кадре. Это хорошо видно напр. на прямоугольных логотипах (при ресайзе с быстрыми боб-деинтерлейсерами типа TDeint такого нет). Поэтому такой ресайз в качестве основного метода приводить не стоит. 3. Выбор деинтерлейсера перед ресайзом по вертикали (или полным). Важно, чтобы деинтерлейсер работал по обоим полям (по тем же соображениям, что выше), т.е. не bob(), не NNEDI. В противном случае - пример: изображение из черных строк в одном поле и белых в другом даст чередование черных и белых кадров. В этом причина пресловутых мерцаний, особенно, если у дисплея аналогичный алгоритм деинтерлейса. При нормальном деинтерлейсе от повадок дисплея можно отстроиться слабой вертикальной фильтрацией (к кадрам применяют Blur(0,0.5) ), при ненормальном - нельзя. Поэтому остается выбор между быстрыми деинтерлейсерами (TDeint, yadif(mod), LeakKerneDeint) и медл. скриптами (QTGMC). Второе может быть оправдано в случае выбора конечного прогрессива, но обходится дорого по времени и вряд ли нужно в случае восстановления интерлейса, 3-4 проходов в CCE и т.п..
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
20-Май-13 22:31
(спустя 26 мин., ред. 20-Май-13 23:51)
У меня вот какой вопрос:
Недавно прислали ссылку на фрагмент фильма: http://yadi.sk/d/pZ2NUemT4s-UQ , http://sendfile.su/809922 (файл один и тот же, просто выложен на разные обменники).
Изучение этого файла показало, что в нём из каждых двух полей одно является нормальным, а другое - бленд двух соседних, нормальных.
Что это - глюк DGAVCDec? (У меня видюшка ATI, поэтому на DGAVCDecNV посмотреть не могу.)
Если нет, то какова природа образования подобного файла?
Кстати, в моей практике это уже второй случай. Первым был большой кусок кинофильма с DVD, но там в процессе его создания было множество пережатий, поэтому грешить можно было много на что. А нынешний фрагмент взят с BD.
Или это таким методом кодировщик из прогрессивного источника делает интерлейсный видеопоток?
|
|
Mikky72
Стаж: 17 лет 9 месяцев Сообщений: 8498
|
Mikky72 ·
20-Май-13 22:37
(спустя 5 мин., ред. 20-Май-13 22:37)
Areyou
Как мне представляется, нужен деинтерлейс с удвоением частоты для сохранения 50/60 фаз движения.
LeakKerneDeint вроде частоту не удваивает, а вот Yadif или TDeint (оба в mode 1 "bob") выглядит предпочтительней.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
21-Май-13 00:00
(спустя 1 час 23 мин., ред. 21-Май-13 00:00)
Mikky72
У LeakKernelDeint такая же функциональность, как у TDeint (есть функция LeakKernelBob), TDeint чуть новее и быстрее. Xpюша
Там пуллдаун 24->25 (половина кадров чересстрочные):
#Decomb.dll
AVCSource("E:\My Downloads\02.track_1.dga")
Telecide(guide=2)
Decimate(25)
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
21-Май-13 00:11
(спустя 11 мин., ред. 21-Май-13 00:11)
Areyou писал(а):
59383097Там пуллдаун 24->25 (половина кадров чересстрочные)
Кадров? Не полей?
Я (с использованием DGAVCDec) после
Код:
AVCSource("V:\02.dga").SeparateFields()
вижу регулярное чередование нормальной картинки и бленда.
После
Код:
AVCSource("V:\02.dga").SeparateFields().SelectOdd()
- одни только бленды.
А после
Код:
AVCSource("V:\02.dga").SeparateFields().SelectEven()
- одни только нормальные кадры. Что и посоветовал человеку использовать для создания DVD.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
21-Май-13 00:50
(спустя 38 мин., ред. 21-Май-13 00:50)
Xpюша
Похоже, в режиме разделения на поля что-то у декодера не выходит. В прогрессив чисто разбирается, без блендов. P.S. Field based не делится на поля.
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
21-Май-13 01:00
(спустя 10 мин., ред. 21-Май-13 01:00)
Areyou писал(а):
59383724Похоже, в режиме разделения на поля что-то у декодера не выходит.
А после просто
Код:
AVCSource("V:\02.dga")
я ни одного прогрессивного кадра не вижу. Все с гребёнками.
Areyou писал(а):
59383724Field based не делится на поля.
Но после SeparateFields() получаю именно это: кадров - в два раза больше, высота каждого кадра - в два раза меньше.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
21-Май-13 01:13
(спустя 12 мин., ред. 21-Май-13 01:13)
Xpюша
Да, я тоже не вижу прогрессива на входе, но перестановка полей работает без блендов, разве что повторный кадр немного странный (слегка отличается по фазе). P.S. Вроде, он и не повторный (видимо, просмотр тормозил), 25fps со сдвигом полей между кадрами - не нужно его удалять, только пересобрать.
|
|
Mikky72
Стаж: 17 лет 9 месяцев Сообщений: 8498
|
Mikky72 ·
21-Май-13 02:16
(спустя 1 час 2 мин., ред. 21-Май-13 02:16)
Xpюша
Что за фильм?
Areyou писал(а):
5938387825fps со сдвигом полей между кадрами
Такой был DVD "Авария".
Почему неправильно разбирается на поля? Ведь мы вроде фактически из BMP уже берем четные/нечетные строки. Почему в каждой строке двоится?
P.S. Добавил соответствующую схему в первый пост.
P.S.S. А нельзя каким-то патчером без перекодирования "поля переставить"?
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
21-Май-13 07:42
(спустя 5 часов, ред. 21-Май-13 07:42)
Mikky72
Почему здесь на поля не разбирается, пока не понимаю. Сам эффект сдвига здесь связан с раздельным кодированием полей (при кодировании кадрами бывает из-за установок кодера или сдвиге до него, либо при вставке полей 24-25 - тогда чередуются 12 прогрессивных с 13 чересстрочными и наоборот) и тем, что последовательные поля приписаны не к своим кадрам, либо так это воспринимает декодер. Это настолько устойчиво приписано, что не удается просто удалить самое первое поле и пересобрать. Но прогрессив здесь легко восстанавливается, самый честный способ - обратный паловский пуллдаун, перестановка полей напр. Telecide(guide=2). Если нет склеек, такой же эффект даёт DoubleWeave().SelectOdd() - здесь тоже оба поля используются, в отличие от SeparateFields, которое странно работает. Но на любой склейке при такой простоте может переключиться на интерлейс (случай DW) или бленд (SF). P.S. На DVD без перекодирования переставить видимо, нельзя, т.к. физически поля хранятся не в "своих" кадрах.
|
|
Panas
Стаж: 16 лет 4 месяца Сообщений: 1805
|
Panas ·
21-Май-13 08:56
(спустя 1 час 14 мин., ред. 21-Май-13 09:22)
Mikky72 писал(а):
59383985Что за фильм?
Blu-Ray "Lifeforce" (1985) 1080i25
Тоже глянул сэмпл. Как уже сказали, подходит скрипт с подбором полей:
AVCSource("G:\9\Test.dga")
AssumeTFF()
TFM()
P.S. Telecide(guide=2) дает небольшую гребенку:
http://prntscr.com/15wxrx
TFM:
http://prntscr.com/15wxw3
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
21-Май-13 09:26
(спустя 30 мин., ред. 21-Май-13 09:26)
Areyou писал(а):
59383878Да, я тоже не вижу прогрессива на входе, но перестановка полей работает без блендов
Вот как у меня выглядит десяток кадров того файла (с точки 00:00:08:03):
А вот эти же кадры, разложенные на поля:
Каждое второе поле - бленд. Переставляй - не переставляй, лучше не станет.
Но я всё ещё подозреваю неправильность работы DGAVCDec. У Вас, наверное, DGAVCDecNV. Выложите, пожалуйста, секунду-другую в нежатом AVI.
Panas писал(а):
59385763Как уже сказали, подходит скрипт с подбором полей:
Больше всего интересует - как такой файл создали?
|
|
Panas
Стаж: 16 лет 4 месяца Сообщений: 1805
|
Panas ·
21-Май-13 09:33
(спустя 6 мин.)
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
21-Май-13 09:39
(спустя 6 мин.)
Это перестановка? Или TFM?
И второй вопрос: декодер - кто?
|
|
Mikky72
Стаж: 17 лет 9 месяцев Сообщений: 8498
|
Mikky72 ·
21-Май-13 09:41
(спустя 1 мин., ред. 21-Май-13 09:42)
Xpюша
Лично у меня по скрипту Areyou идет чистое прогрессивное видео без блендов (оба декодера DGDecodeNV и DGAVCDec).
Конечно, на картинке есть смазы при взмахах рук, но это уже мажет затвор кинокамедры.
|
|
Panas
Стаж: 16 лет 4 месяца Сообщений: 1805
|
Panas ·
21-Май-13 09:44
(спустя 3 мин., ред. 21-Май-13 09:47)
Xpюша писал(а):
59385937Больше всего интересует - как такой файл создали?
DGAVCIndex 1.0.9.
Field Operation -> Honor Pulldown Flags
Xpюша писал(а):
59386066Это перестановка? Или TFM?
TFM - это и есть перестановка (подбор) полей
Xpюша писал(а):
59386066И второй вопрос: декодер - кто?
DGAVCDecode (дата 10.03.2009)
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
21-Май-13 09:47
(спустя 2 мин.)
Panas писал(а):
59386088TFM - это и есть перестановка (подбор) полей
У меня в прошлом результат работы TFM() от простой перестановки визуально отличался - примерно соответствовал добавлению SmoothDeinterlace() в конце цепочки.
Panas писал(а):
59386088DGAVCDecode (дата 10.03.2009)
Ясно. "Будем копать."
|
|
Panas
Стаж: 16 лет 4 месяца Сообщений: 1805
|
Panas ·
21-Май-13 09:57
(спустя 10 мин.)
Xpюша писал(а):
59386157У меня в прошлом результат работы TFM() от простой перестановки визуально отличался - примерно соответствовал добавлению SmoothDeinterlace() в конце цепочки.
И у TFM и у Telecide по умолчанию включен постпроцессинг - делается деинтерлейс на найденных combed frames.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
22-Май-13 23:13
(спустя 1 день 13 часов)
Mikky72 писал(а):
59383985Добавил соответствующую схему в первый пост.
Возможно, стоит предусмотреть ещё один тип исходника: NTSC BD, полученные из PAL - HDTV программ. Во многих случаях их делают с блендами в полях (как когда-то для DVD), а деблендерами они восстанавливаются только в прогрессив, т.е. случай специфический. На трекере такие BD попадаются, а PAL-альтернативы бывает не найти.
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
23-Май-13 17:29
(спустя 18 часов, ред. 23-Май-13 17:29)
Panas писал(а):
59386242И у TFM и у Telecide по умолчанию включен постпроцессинг - делается деинтерлейс на найденных combed frames.
Выкроил время и сравнил. На том файле TFM с отключённым постпроцессингом (TFM(pp=0)) выдаёт в точности то же самое, что и SeparateFields().DuplicateFrame(0).Weave().
Следовательно;
а) TFM() выдал такую красивую картинку не за счёт перестановки полей, а за счёт последующей обработки. А это означает, что в применении TFM нет смысла - лучше воспользоваться средствами, ориентированными на борьбу именно с блендами (если нужно HD получить).
Впрочем, это не столь важно, ибо главное:
б) в том файле таки каждое второе поле является блендом двух своих соседей (и для получения SD хватит простого выбрасывания полей).
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
23-Май-13 21:31
(спустя 4 часа)
Xpюша
Да, вы правы, поля реально запорчены. Но удалять строго через одно можно только просмотрев четность на всем фильме. Нерегулярности (другого рода) видны даже пределах этого фрагмента, это неравномерно встречающиеся повторные кадры после восстановления без блендов.
|
|
Xpюша
Стаж: 15 лет 5 месяцев Сообщений: 3635
|
Xpюша ·
25-Май-13 10:09
(спустя 1 день 12 часов, ред. 25-Май-13 10:09)
Areyou писал(а):
59421722это неравномерно встречающиеся повторные кадры после восстановления без блендов.
Не знаю, не знаю. Вчера перед сном отсмотрел весь образец покадрово (после SelectEven()) - ни одного дубля не обнаружил.
Да если бы даже они и были: на входе 25 к/с, на выходе тоже нужно получить 25 к/с, поэтому возможны только 2 варианта:
1. Дубли встречаются нерегулярно, но 1 на 25. Отстреливаем их каким-то дециматором похожих кадров, а то, что осталось, ускоряем до 25 к/с.
2. Дубли встречаются действительно нерегулярно. Тут уже ничего не поделаешь, придётся оставлять как есть.
Но вообще-то я бы сказал, что конкретно это фильм - upscale, поэтому особо напрягаться с обработкой нет смысла, т.к. "выбросить половину строк кадра, а остаток проинтерполировать до 1080" даст тот же результат, который в идеале должен был бы быть на этом BD.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
25-Май-13 11:50
(спустя 1 час 40 мин.)
Xpюша
Возможно, это я наблюдал особенности работы с такими полями Telecide() на стыках сцен - я закодировал в CCE, чтобы не тормозило, и просмотрел по кадрам. Меня интересовало, нет ли регулярных повторных кадров (по количеству их оказалось примерно 1:40 и чаще на стыках сцен). Но сейчас хоть ясно, что дело было в дефолтной установке на деинтерлейс по полям, а не в глюке с разделением и без того раздельных (с декодера) полей.
|
|
tartak
Стаж: 18 лет 9 месяцев Сообщений: 2548
|
tartak ·
26-Май-13 09:53
(спустя 22 часа, ред. 26-Май-13 09:53)
Tempter57 писал(а):
59374454BicubicResize(Last.Width, 576, -0.8, 0.6)
А откуда такие странные параметры взялись?
Tempter57 писал(а):
59374454Наиболее чаще применяется самый простой и быстрый скрипт с боб-деинтерлейсом без всякой обработки шумодавами:
Код:
...
LeakKernelBob(order=1)# первое поле верхнее (TFF)
...
Он хоть и не медленный, но чем он лучше, чем в самом деле самый простой и быстрый боб из моего первого сообщения?
Tempter57 писал(а):
59374454Упомянутый tartak HD2CD тоже есть в виде строки настроек:
Очень бы не хотелось пользоваться этим комбайном. Внутри там сомнительные вещи; непонятно, кем он обкатывался и где обсуждался. И вообще, всегда лучше глубоко разобраться в более простых инструментах, чем вынужденно поверхностно пользоваться сложными (особенно если неясно, чем они лучше).
Areyou писал(а):
593817151. Если точнее о допустимости ресайза в чересстрочном видео, то категорически нельзя его делать только по вертикали. Поскольку горизонтальный и вертикальный ресайзеры в Ависинте совершенно разделены (как это ни странно), то в интересах ускорения работы деинтерлейсера (особенно если применяется скрипт вроде QTGMC), можно предварительно делать горизонтальный ресайз.
Да, разумеется, совершенно согласен. Как и фильтр верхних частот (размазывание) нужно делать отдельно,
tartak писал(а):
59372832как ставить высокочастотный фильтр (по вертикали, по горизонтали)
Areyou писал(а):
593817152. Тот скрипт ресайза на разделённых полях отрабатывался на doom9 в отношении ошибок вертикального рассовмещения ..
Но проблема не в точности устранения этой ошибки - это общая проблема ресайза на разделённых полях. На неподвижном изображении полной четкости нарушается условие теоремы отсчётов: в процессе ресайза оно представлено половиной нужного их числа. С визуальной точки зрения, часть элементов изображения, сдвигаемых при ресайзе, не может попасть в строку второго поля. В результате проиходит расслоение резких горизонтальных границ объектов в неподвижном кадре. Это хорошо видно напр. на прямоугольных логотипах (при ресайзе с быстрыми боб-деинтерлейсерами типа TDeint такого нет). Поэтому такой ресайз в качестве основного метода приводить не стоит.
Какой именно ресайз вы имеете в виду? Тот, что я привел, или что-то другое? Вы вроде бы говорите о теореме Найквиста... Да, в статической части кадра, умный боб выдаст более резкую картинку, чем простой боб из моего сообщения, как до, так и после ресайза. Ну и что? Резкость эта незаконна с точки зрения интерлейса. Она только на скриншоте выглядит лучше. По любому понадобится фильтр верхних частот, и с умными бобами размазывать просто придется больше, чем с простыми. А результат в итоге тот же. Если у вас есть конкретный пример, где "хорошо видно", давайте его в студию. Не идет ли речь о деталях толщиной в одну линию?
Areyou писал(а):
59381715если не путаю, позже появилась дл-лка с этим же алгоритмом
Где, не видел? То есть, фактически bob() исправили?
Areyou писал(а):
593817153. Выбор деинтерлейсера перед ресайзом по вертикали (или полным). Важно, чтобы деинтерлейсер работал по обоим полям (по тем же соображениям, что выше), т.е. не bob(), не NNEDI. В противном случае - пример: изображение из черных строк в одном поле и белых в другом даст чередование черных и белых кадров. В этом причина пресловутых мерцаний, особенно, если у дисплея аналогичный алгоритм деинтерлейса.
Опять же, не согласен. И пример этот совершенно незаконен. Любое интерлейсное видео основано на естественном предположении, что картинка не слишком меняется за время между полями. А у вас получается, что снимается то белый, то черный фон, чередующиеся каждые 1/50 сек. Ни один деинтерлейсер ничего разумного не выдаст, просто потому, что невозможно согласиться, что было бы разумным для патологической картинки, которая не имеет право на существование. Чтобы убрать мерцание, нужен фильтр верхних частот, и он нужен в любом варианте (кстати используется по умолчанию в ССЕ). Что-нибудь типа
Код:
blur(0,0,7).sharpen(0,0.5)
для простого боба и сильнее для "умного" (типа, "горе от ума" )
|
|
Tim68
Стаж: 14 лет 10 месяцев Сообщений: 712
|
Tim68 ·
26-Май-13 10:38
(спустя 44 мин., ред. 26-Май-13 10:38)
tartak писал(а):
59452427Любое интерлейсное видео основано на естественном предположении, что картинка не слишком меняется за время между полями. А у вас получается, что снимается то белый, то черный фон, чередующиеся каждые 1/50 сек. Ни один деинтерлейсер ничего разумного не выдаст, просто потому, что невозможно согласиться, что было бы разумным для патологической картинки, которая не имеет право на существование.
Подобное случается, стоит почитать отсюда, внимателнее к
Штирлиц75 писал(а):
55895143Единственно - изображение барышни у Вас одинарное, в то время как в исходнике - сходящееся из двух изображений.
Tempter57 писал(а):
55896422Эффект схождения кадров реализован банально просто: верхнее поле идёт слева направо, а нижнее поле справа налево.
|
|
Areyou
Стаж: 16 лет Сообщений: 1704
|
Areyou ·
26-Май-13 14:32
(спустя 3 часа, ред. 26-Май-13 20:32)
tartak
Цитата:
Какой именно ресайз вы имеете в виду? Тот, что я привел, или что-то другое?
Тот скрипт с разделением на поля, что вы привели - он мне напомнил вот эту дискуссию с участием IanB, одного из нынешних разработчиков Ависинта:
http://forum.doom9.org/showthread.php?p=1031317#post1031317
Я помню, что парой лет позже это было активно продолжено в интересах уточнения формулы, но с ходу не нашёл, где.
Цитата:
Areyou писал(а):
если не путаю, позже появилась дл-лка с этим же алгоритмом
Где, не видел? То есть, фактически bob() исправили?
С длл-кой могу ошибаться, могла просто попасться на глаза функция InterlacedResize аналогичного назначения из довольно старого плагина SimpleResize. С бобом это не связано, у него другая задача (получить из полей кадры). А здесь решается задача получения полей из полей, поэтому расчёт сдвигов изображения по растру идёт по-своему.
Цитата:
Вы вроде бы говорите о теореме Найквиста... Да, в статической части кадра, умный боб выдаст более резкую картинку, чем простой боб из моего сообщения, как до, так и после ресайза. Ну и что? Резкость эта незаконна с точки зрения интерлейса. Она только на скриншоте выглядит лучше.
Цитата:
По любому понадобится фильтр верхних частот, и с умными бобами размазывать просто придется больше, чем с простыми. А результат в итоге тот же.
Да, Котельникова-Найквиста. Статическая часть кадра таковой является не только на скриншотах (фон может быть неподвижным любое время), и дело не только в резкости, а в возможности восстановления без муаров изображения, представленного меньшим числом отсчётов, чем требует эта теорема.
О законности резкости. С точки зрения параметров, заложенных в ту или иную телевизионную систему, при имеющемся количестве строк растра реализуется вполне определенная четкость, и оптическая фильтрация перед разбиением на строки согласована с этим количеством строк, безотносительно последовательности развертки, чересстрочная - это всего лишь способ воспроизведения движения, и специально под неё чёткость не портят. Другое дело, что любые оптические фильтры, применяемые перед дискретизацией, имеют плавную характеристику и полностью не исключают верхней части спектра (при хорошей фокусировке объектива), поэтому условия теоремы можно выполнить весьма приблизительно (реально нужно отн. сужать полосу фильра). Но различие при использовании при деинтерлейсе одного поля либо двух таково: если для полного числа строк условия теоремы едва выполнялись (хорошая фокусировка и т.п.), то они перестают выполняться при отсчётах, взятых из того же кадра через один. Я это лишь проиллюстрировал для наглядности крайним случаем. На реальных четких изображениях просто у соседних кадров будет разная средняя яркость, и этого достаточно для мерцаний на неподвижном изображении. Если же деинтерлейс сделан смарт-бобом, то подобные артифакты минимальны. А простой боб вполне подошёл бы при источнике-апскейле (в этом случае без вертикального фильтра можно обойтись).
Вертикальный фильтр перед восстановлением интерлейса нужен, главным образом, для защиты от тупых боб-деинтерлейсеров некоторых телевизоров, которые могут работать просто по полям. Этот фильтр был бы совершенно ненужным при чересстрочном же воспроизведении, но развитие идет в направлении прогрессивных устройств, и с этим приходится считаться.
Цитата:
Любое интерлейсное видео основано на естественном предположении, что картинка не слишком меняется за время между полями.
C точки зрения передачи движения - да. Но если в кадре есть что-то неподвижное, то его детали и контуры складываются из двух полей и не имеет значения, что например, на чересстрочном дисплее поля выводятся почередно - они за счёт инерционности зрения (на лучевой трубке - инерционности свечения и т.п.) складываются при восприятии в одно изображение с той же четкостью, что в прогрессиве того же числа строк. Каждое поле несет информацию о детальности изображения на своей "высоте". Поэтому деинтерлейсеры тех дисплеев, где применяется аналог простого bob(), реально убивают вертикальную чёткость вдвое (это если отвлечься от дополнительных к этому муаров и мерцаний при чётком изображении). Сделанные из полей кадры хоть и различаются по содержанию (происходя от разных по уровню строк), из них геометрически уже не складывается исходное изображение полной четкости.
Цитата:
Чтобы убрать мерцание, нужен фильтр верхних частот, и он нужен в любом варианте (кстати используется по умолчанию в ССЕ).
Я согласен, что при чётком HD исходнике для DVD нужно фильтровать по вертикали (перед новым интерлейсом). Но в CCE фильтр предназначен для другого - для понижения "комариных" шумов, и он двумерный. Даже предусмотрена работа по полям на чересстрочном источнике с предостережением не перестараться с параметрами, поскольку по вертикали это небезобидно. По дефолту там шаблон направлен на кодирование свежего источника с камеры (напр. DV BFF) в TFF для DVD, видимо, поэтому и включено.
Цитата:
Если у вас есть конкретный пример, где "хорошо видно", давайте его в студию. Не идет ли речь о деталях толщиной в одну линию?
Да, если изображение достаточно четкое, то горизонтальная граница объекта отслаивается и может отстоять на строку (и это строка DVD). У меня это ясно проявлялось на логотипе MTVHD, но сейчас под рукой нет такого источника, чтобы это бросалось в глаза в варианте с bob(). А вот для представленного вами скрипта с раздельным ресайзом полей вполне можно продемонстрировать и на умеренно чётком источнике 1080i (здесь статичное изображение):
Ресайз через TDeint:
MPEG2Source("M:\[HDTV]-Paul McCartney SNL 15.12.12 HDTV 1080i\test.d2v", cpu=0)
trim(180,400)
TDeint(mode=1)
Lanczos4Resize(720,480)
AssumeTFF()
SeparateFields()
SelectEvery(4,0,3)
Weave()
Ресайз через скрипт с разделением на поля и коррекцией ошибок:
MPEG2Source("M:\[HDTV]-Paul McCartney SNL 15.12.12 HDTV 1080i\test.d2v", cpu=0)
trim(180,400)
AssumeTFF()
SeparateFields()
Shift = (GetParity() ? -0.25 : 0.25) * (1080/(480/2) - 1.0)
E = SelectEven(). BicubicResize(720, 480/2, 0, 0.5, 0, Shift)
O = SelectOdd(). BicubicResize(720, 480/2, 0, 0.5, 0, -Shift)
Ec = SelectEven(). BicubicResize(720, 480/2, 0, 0.5, 0, 2*Shift)
Oc = SelectOdd(). BicubicResize(720, 480/2, 0, 0.5, 0, -2*shift)
Interleave(E, O)
IsYV12() ? MergeChroma(Interleave(Ec, Oc)) : Last
Weave()
Видно деградацию на наклонных линиях, под малым углом пересекающих строки (включая букву S логотипа, рукава и пр.) и явный муар на полосках вертикально свисающего шарфа.
|
|
|