|
Ostatnio dodane
Najchętniej pobierane
|
|
|
|
|
VideoAudio.pl - serwis o technologii video/audio WITAMY:
biniekjako nowego użytkownika.
Zarejestrowanch Uzytkowników: 3877
Super Administratorzy: 3
Administratorzy: 2 Użytkownicy: 3872
Użytkownicy Online:
Gości Online: 16
Najwiecej online: 106
Bylo: 27.05.2008-19:56 Twoje IP to: 38.107.179.209
|
|
|
|
|
|
Poprzedni | Następny| NTSC Inverse Telecine w AviSynth |
Aby wykorzystaćdowolną z opisanych tu metod należy zainstalować AviSynth
2.5.x oraz wyposażyć się w odpowiednie wtyczki dostępne tutaj
(ściągając każdą z nich należy wybrać wersję dla AviSynth 2.5.x). Pliki
*.dll z archiwów *.zip
poszczególnych wtyczek należy skopiować do katalogu wtyczek
AviSynth (domyślnie C:\Program Files\AviSynth 2.5\plugins)
- wówczas będziemy mogli się nimi posługiwać bez użycia LoadPlugin().
Zakłada się, że czytelnik zna podstawy AviSynth oraz obsługę programu
VirtualDubMod (który w dalszych rozważaniach będziemy
określać skrótem VDM).
Słowo wstępne
W zależności od źródła jego pochodzenia, możemy
wyróżnić dwa rodzaje przeplotu: "naturalny" i "sztuczny".
Przeplot "naturalny" (którego dotyczy ten
artykuł) powstaje już w trakcie filmowania - kamera nie
filmuje pełnych klatek, lecz najpierw jeden półobraz, zaś
chwilę później drugi (w ten sposób pracują kamery
telewizyjne a także amatorskie kamery cyfrowe DV). Przeplot "sztuczny"
(którego dotyczy niniejsze opracowanie) powstaje wskutek
wykonania procesu telecine, czyli dostosowania
filmu progresywnego (filmowanego pełnowymiarowymi klatkami) do emisji w
telewizji. Elementem procesu telecine jest
rozdzielenie każdej klatki na półobrazy, ponieważ w
analogowym sygnale telewizyjnym muszą być one rozdzielone. Z
progresywnych klatek
ABCD
uzyskujemy klatki podzielone na półobrazy górne (t) i dolne (b):
AtBtCtDt
AbBbCbDb
Jest to tzw. 2:2 pulldown.
Następnie konieczna jest korekta ilości klatek na sekundę (w
skrócie FPS od angielskiego frames per second)
w filmie. Filmy kinowe kręcone są przy 24 FPS, zaś systemy telewizyjne
PAL i SECAM używają 25 FPS (50 półobrazów na
sekundę), a NTSC 29.97 FPS (59.94 półobrazów na
sekundę). W przypadku dwóch pierwszych systemów
(których dotyczy niniejsze opracowanie) zazwyczaj
dokonuje się tego poprzez przyspieszenie z 24 do 25 FPS oraz
ewentualnej późniejszej korekty tonacji dźwięku
(która wskutek jego przyspieszenia została nieco podniesiona
i może brzmieć nienaturalnie, co jest szczególnie odczuwalne
w przypadku muzyki). W systemie NTSC jest to nieco bardziej
skomplikowane - najpopularniejszym sposobem konwersji z 24 do 29.97 FPS
jest tzw. 3:2 pulldown, który wygląda
następująco: spowalniamy film z 24 do 23.976 FPS, a potem z czterech
klatek ABCD
rozdzielonych na półobrazy górne (t) i dolne (b):
AtBtCtDt
AbBbCbDb
poprzez przestawienie i duplikację niektórych
półobrazów uzyskujemy pięć klatek:
AtAtBtCtDt
AbBbCbCbDb
Jak widać, proces telecine w systemie NTSC zaburza
płynność ruchów (poprzez duplikację
półobrazów) oraz progresywną strukturę klatek,
Aby film poddany 3:2 pulldown był prawidłowo
odtwarzany, musimy ten proces odwrócić i tego właśnie
dotyczy niniejsze opracowanie.
UWAGA:
Niedopuszczalna jest zmiana rozdzielczości pionowej obrazu
przed usunięciem przeplotu (zmiana rozdzielczości poziomej też nie jest
polecana). Należy też pamiętać, że tylko materiał pochodzący z
progresywnego źródła posiadający 29.97 lub 30 klatek na
sekundę (ewentualnie zbliżoną wartość) i artefakty przeplotu może
zawierać wzorzec 3:2 pulldown i tylko do takich
materiałów należy stosować opisaną niżej procedurę.
1. Określanie prawidłowej kolejności
półobrazów
Działanie funkcji i wtyczek AviSynth opisywanych w tym artykule jest
uzależnione od kolejności półobrazów w materiale
żródłowym, toteż musimy ją prawidłowo określić. Wprawdzie
AviSynth sam stara się ją rozpoznać i dysponuje wbudowaną funkcją GetParity()
(zwracającą true
dla materiału TFF, zaś false
dla materiału BFF), lecz często informacja ta okazuje się nieprawdziwa.
Aby "ręcznie" określić prawidłową kolejność
półobrazów, piszemy skrypt postaci:
AVISource("ścieżka\plik.avi")
AssumeTFF()
SeparateFields()
Następnie otwieramy go w VirtualDubMod i przewijamy suwakiem obserwując
ruch. Jeśli ruch przebiega tylko w jednym kierunku (z ewentualnymi
przestojami spowodowanymi półobrazami pochodzącymi z tej
samej klatki) bez żadnych cofnięć, oznacza to, że znaleźliśmy właściwą
kolejność półobrazów - jest to TFF, czyli
półobraz górny jest zapisany jako pierwszy. Jeśli
ruch jest szarpany (po półobrazie zawierającym ruch w
prawidłowym kierunku następuje półobraz z cofnięciem),
czynność powtarzamy dla skryptu:
AVISource("ścieżka\film.avi")
AssumeBFF()
SeparateFields()
Teraz ruch powienien już być prawidłowy, a kolejność
półobrazów to BFF - dolny półobraz
jest zapisany jako pierwszy.
Kolejność półobrazów należy zapamiętać, gdyż
będziemy ją podawać jako argument funkcjom używanym w kolejnych
przykładach.
2. Rozpoznanie wzorca duplikacji
półobrazów
Aby przekonać się, czy nasz materiał zawiera wzorzec 3:2
pulldown, czy 3:2:3:2:2 pulldown,
otwieramy w VirtualDubMod skrypt:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=0,post=3,show=true,chroma=true,hints=true)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Teraz powoli przewijając go w VDM sprawdzamy, czy Telecide()
znalazł stały wzorzec układu półobrazów. Należy
zwrócić uwagę na informacje wyświetlane w ostatnich
dwóch linijkach. W rubryce [using
?]
powinien występować stały cykl liter postaci cccnn
lub nnncc (ewentualnie inna
kombinacja z użyciem litery p,
ale też w proporcjach 3:2), zaś w sąsiadującej z nią rubryce [progressive]
(ewentualnie [interlaced],
ale tylko sporadycznie).
Jeśli warunek ten jest spełniony dla każdej sceny (tzn. zmiana wzorca
występuje tylko w momentach cięć), znaczy to, że zidentyfikowaliśmy
wzorzec 3:2 pulldown. Możemy się go spodziewać w
filmach kinowych a także serialach telewizyjnych kręconych w krajach
NTSC. Jeśli zaś w rubryce [using
?]
występuje stały cykl liter typu ccccnn lub nnnncc
(ewentualnie inna kombinacja z użyciem litery p,
ale też w proporcjach 4:2), znaczy to, że mamy do czynienia z 3:2:3:2:2
pulldown. Wzorzec ten jest spotykany czasem w materiałach
kręconych progresywnie przy 25 FPS dla telewizji w krajach PAL i SECAM.
3. Odwrócenie procesu telecine
(a) 3:2 pulldown
Aby pozbyć się zduplikowanych półobrazów oraz
poustawiać pozostałe w prawidłowej kolejności, należy użyć skryptu
postaci:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=1,post=2,show=false,chroma=true,hints=true,blend=false)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Decimate(cycle=5)
To spowoduje, że Telecide()
usunie przesunięcie półobrazów, a następnie
wykona postprocessing, czyli usunie pozostające w
filmie artefakty przeplotu (któych powinno być bardzo mało,
mogą wystąpić np. w logo wytwórni na początku lub końcu
filmu) metodą analogiczną do FieldDeinterlace(blend=false)
(informacje o poszczególnych parametrach funkcji Telecide()
oraz FieldDeinterlace()
znajdziecie na polskiej
stronie AviSynth). Ustawiając w Telecide()
parametr blend=true
uzyskamy zlewanie półobrazów w obszarach
zawierających przeplot (w przypadku blend=false
stosowana jest interpolacja). Ważne jest, aby zaraz po Telecide()
użyć Decimate()
- dzięki temu pierwsza funkcja będzie mogła przekazać drugiej
podpowiedzi (numery zduplikowanych klatek). Pamiętajmy, że Telecide()
nie usuwa duplikatów, a jedynie dopasowuje do siebie
półobrazy przywracając progresywne klatki. W celu usunięcia
duplikatów musimy użyć jednej z funkcji stworzonych do tego
celu - najlepszym wyborem będzie tu właśnie Decimate(),
która pochodzi z tego samego pakietu decomb.dll
i została zaprojektowana do ścisłej współpracy z Telecide().
Możliwe też jest użycie KernelDeint()
do postprocessingu zamiast FieldDeinterlace()
- wystarczy użyć skryptu postaci:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=1,post=1,show=false,chroma=true,hints=true)
KernelDeint(order=?)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Decimate(cycle=5)
(b) 3:2:3:2:2 pulldown
Tym razem skrypt ma postać:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=3,post=2,show=false,chroma=true,hints=true,blend=false)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Decimate(cycle=6)
Nietrudno spostrzec, że różni się on od skryptu dla 3:2
pulldown tylko wartością parametru guide
w Telecide()
(1 dla 3:2 pulldown, 3 dla 3:2:3:2:2
pulldown) oraz wartością parametru cycle
(5 dla 3:2 pulldown, 6 dla 3:2:3:2:2
pulldown). Ta ostatnia zmiana spowodowana jest częstością
występowania duplikatów - w pierwszym przypadku jedna na
pięć klatek jest duplikatem, w drugim zaś jedna na sześć.
Podobnie jak w poprzednim przypadku, tak i tu możemy użyć KernelDeint()
do wykonania postprocessingu:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=3,post=1,show=false,chroma=true,hints=true)
KernelDeint(order=?)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Decimate(cycle=6)
Suplement A. Materiały hybrydowe
(a) ...zawierające głównie materiał pulldown
Większość seriali emitowanych w krajach NTSC zawiera partie kręcone
progresywnie przy 23.976/24 FPS oraz krótkie fragmenty
29.97/30 FPS (progresywne lub z przeplotem), np. sekwencje złożone
tylko z animacji komputerowej, czołówka i napisy końcowe.
Najkorzystniej byłoby wykonać IVTC na partiach filmowych (zmniejszając
FPS do 23.976/24) i usunąć artefakty przeplotu z partii wideo
(pozostawiając je przy 29.97/30 FPS). Ponieważ jednak AviSynth nie
obsługuje zmiennej prędkości klatkowej (z ang. variable
framerate, w skrócie VFR), musimy znaleźć
sposób na zachowanie jednolitej wartości FPS w całym klipie.
Możemy to zrobić dzięki rozdziałowi funkcji w pakiecie decomb.dll
(Telecide()
przywraca progresywne klatki, Decimate()
zmienia FPS) oraz dużych możliwościach Decimate().
Tym razem nasz skrypt wygląda tak:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=?,post=2,show=false,chroma=true,hints=true,blend=false)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
# parametr guide ustawiamy
na 1 dla 3:2 pulldown, 3 dla 3:2:3:2:2
pulldown
Decimate(cycle=?,mode=3,threshold=2.5)
# parametr cycle ustawiamy
na 5 dla 3:2 pulldown, 6 dla 3:2:3:2:2
pulldown
Wartość 3 parametru mode
w Decimate()
powoduje, że fragmenty progresywne są traktowane inaczej, niż fragmenty
"przeplecione". Tam, gdzie Telecide()
wykrył wzorzec 3:2 pulldown, zduplikowane klatki są
usuwane, zaś we fragmentach uznanych przez Telecide()
za "przeplecione" Decimate()
zastosuje "zlewanie" klatek (z których Telecide()
wcześniej usunął artefakty przeplotu). Aby ten mechanizm zadziałał
prawidłowo, Decimate()
należy użyć zaraz po Telecide()
oraz ustawić Telecide()=1.
Drugim kryterium wyboru sposobu zmniejszenia FPS (jedynym,
które działa dla 3:2:3:2:2 pulldown)
jest wartość parametru threshold
w Decimate()
(wartość 2.5 w skrypcie jest tylko przykładowa). Decimate(cycle=N,mode=3)
sprawdza dla każdych N klatek, czy są wśród nich dwie
identyczne (sąsiadujące ze sobą) klatki. Jeśli znajdzie dwie takie
klatki, usuwa jedną z nich, jeśli nie, traktuje ten cykl N klatek jak
materiał wideo ("zlewa" dwie klatki w jedną). Wartość threshold to
ilość różnic (w procentach) pomiędzy dwoma klatkami,
którą trzeba przekroczyć, aby dwie klatki zostały uznane za
różne (im wyższy threshold,
tym bardziej muszą się różnić klatki, aby zostały uznane za
różne). Wartość 0 wyłącza ten sposób poszukiwania
duplikatów.
(b) ...zawierające głównie materiał wideo
Dotyczy to na przykład programów dokumentalnych typu "making
of" (opowiadających o produkcji filmu kinowego) zawierających wywiady i
materiały z planu filmowego kręcone z przeplotem i krótkie
fragmenty filmu zawierające 3:2 pulldown.
Skrypt ma postać:
AVISource("ścieżka\film.avi")
AssumeTFF() # jeśli stwierdziliśmy TFF w punkcie pierwszym
# AssumeBFF() jeśli stwierdziliśmy BFF w punkcie pierwszym
Telecide(order=?,guide=1,post=2,show=false,chroma=true,hints=true,blend=false)
# parametr order ustawiamy
na 1 dla TFF, 0 dla BFF
Decimate(cycle=5,mode=1,threshold=2.5)
Wartość 1 parametru mode
każe Decimate()
pozostawić oryginalną ilość klatek na sekundę. Podobnie jak w przypadku
mode=3,
tak i tutaj Decimate()
posługuje się podpowiedziami pochodzącymi od Telecide().
Tam, gdzie Telecide()
wykrył wzorzec 3:2 pulldown, duplikaty są
traktowane w następujący sposób: z klatek A B
C C
D otrzymujemy A B
C C+D D,
gdzie C+D powstaje przez
"zlanie" klatek C
i D.
Klatki pochodzące z fragmentów wideo są wykrywane tak jak w
podpunkcie a i pozostawiane bez zmian.
Suplement B. DVD i 3:2 pulldown
W przypadku filmów kinowych wydawanych na DVD w regionach
NTSC, proces 3:2 pulldown jest zazwyczaj wykonywany
dopiero podczas odtwarzania (film jest zapisany na DVD jako 23.976 FPS
bez zduplikowanych półobrazów). Jest to możliwe
dzięki istnieniu w strumieniu wideo znaczników top
field first (TFF) i repeat first field
(RFF), które mówią odtwarzaczowi kiedy i jak ma
powtarzać półobrazy. Dla grupy czterech klatek wartości
znaczników wyglądają tak:
| Klatka |
A
|
B
|
C
|
D
|
| TFF
|
TAK |
- |
- |
TAK |
| RFF
|
TAK |
- |
TAK |
- |
Gdy naszym źródłem jest taka płyta DVD, wykonywanie inverse
telecine może się okazać niepotrzebne. Aby otworzyć strumień
MPEG-2 w AviSynth za pomocą dgdecode.dll (dawniej mpeg2dec3.dll),
tworzymy plik projektu *.d2v za pomocą DGIndex
(dawniej DVD2AVI). Po uruchomieniu programu używamy
polecenia File -> Autoincrement Open (albo
klawisza F3) po czym wskazujemy pierwszy plik *.vob
naszego filmu.
Następnie klikamy OK i z głównego menu
programu wybieramy polecenie Video -> Field Operation
-> Forced FILM.
Potem zapisujemy projekt *.d2v poleceniem File
-> Save Project (lub klawiszem F4).
Potem otwieramy plik projektu w AviSynth poleceniem:
MPEG2Source("ścieżka\projekt.d2v")
Otrzymamy prawidłowy progresywny klip, który możemy dalej
przetwarzać.
Epilog
Wprawdzie pojawienie się DVD zlikwidowało część problemów
powodowanych przez telecine w systemie NTSC, lecz w
przypadku materiałów pochodzących ze źródeł
analogowych (telewizja, VHS) wciąż napotykamy na zduplikowane
półobrazy, przez co metody opisane w tym artykule wciąż mają
rację bytu. Niemożliwe jest opisanie wszystkich możliwych patologii, na
jakie możemy się natknąć przetwarzając materiały pochodzące ze
źródeł progresywnych, dlatego ów poradnik należy
traktować jako zachętę do dalszych eksperymentów, nie zaś
jak zamknięte kompendium wiedzy.
Artykuł dostępny jest również w formie dokumentu PDF
Aby ściągnąć plik skorzystaj z menu kontekstowego myszy i opcji Zapisz element docelowy jako... |
| |
|
|
| Poprzedni | Następny
Dodawanie ocen dostępne tylko dla zalogowanych Użytkowników.
Proszę się zalogować lub zarejestrować, żeby móc dodawać oceny.
Brak ocen.
|
|
|
|
|
|
|