# FDecimate

## Přehled

autor: Donald A. Graft
verze: 1.1.0
stáhnout: http://neuron2.net/mine.html, http://avisynth.org/warpenterprises/
kategorie: Odstraňování prokládání & pulldown
požadavky: YV12 & YUY2 barevné prostředí

### Úvod

Filtr FDecimate() poskytuje rozšíření decimačních schopností, které nejsou dostupné v Decimate(). Může odstraňovat snímky z klipu pro dosažení požadované frekvence snímků, a přitom zachová audio/video synchronizaci. Ppřednostně odstraňuje duplikované snímky kde je to možné. ("FDecimate" znamená "Free Decimate", což ukazuje, že výstupní frekvence snímků může být volně vybrána, a není omezena na decimaci 1-z-N).

Stále více vídáme aplikace, kde tradiční decimace 1-z-N není dostatečná. Čtyři z nich zvlášť vyčnívají.

První, High Definition (HD) digitální televize často doručuje dvojnásobnou frekvenci snímků, např., 59.94 fps pro ATSC. Progresivní film s nativní frekvencí snímků 24 fps může být převeden na HD frekvenci duplikováním snímků podle šablony. Například pro převod z 24 fps na 60 fps, můžeme použít tuto šablonu:

A A A B B C C C D D E E E F F ...

Můžeme ji nazvat 3232... duplikační šablonou snímků. Dalším příkladem je převod 25 fps na 60 fps, který používá 3232232322... šablonu. Převedení z 60 fps na vysílací frekvenci 59.94 fps lze dosáhnout buď zpomalením videa a úpravou audia pro srovnání délky, nebo vyřazením jednoho duplikátu každých 1000 snímků. V každém případě, náš konečný stream má hodně duplikátů a přístup tradiční decimace 1-z-N už dál nelze přímo používat. Občas lze použít několik po sobě jdoucích decimací 1-z-N , ale to je těžkopádné. A zatímco Decimate(mode=2) je užitečná s vícenásobnými duplikáty, není vždy úspěšná v tomto ohledu.

Za druhé, animované filmy jsou často rendrovány při 12 fps a převáděny na 29.97 fps duplikováním snímků způsobem podobným tomu popsanému výše. Výsledek je stejný: stream s vícenásobnými duplikáty, který není spolehlivě řešen v decimaci 1-z-N.

Za třetí, řada němých filmů je převáděna na DVD s přidáváním duplikátů s neobvyklými šablonami, proto původní frekvence snímků nejsou 24 fps. Není neobvyklé vidět klipy vyžadující zvláštní decimace jako 20 ze 43. Občas lze těchto zvláštních decimací dosáhnout nebo téměř dosáhnout, opakovaným použitím Decimate() využívajícím různých cyklů, ale to je těžkopádný přístup, kterým nelze vždy dosáhnout přesných decimačních poměrů. FDecimate() umožňuje zadat jakoukoliv frekvenci snímků a je proto užitečný při obnově původních natáčecích frekvencí těchto němých filmů.

Za čtvrté, občas jsou klipy rendrovány při 120 fps pro správnou přítomnost hybridů filmu a videa. Pokud si přejeme vrátit normální frekeveci snímků, potřebujeme odstranit vícenásobné duplikáty.

Filtr FDecimate() pomůže v takových situacích. Dřívější filtr, MultiDecimate(), se také snažil pomoci, ale je to dvou-průchodová implementace, která vyžaduje doplňkový externí program, a je proto těžkopádný. Také mohl vytvářet audio desynchronizaci, pokud nebyl použit velmi opatrně. Považuji FDecimate() za lepší přístup.

Všimněte si prosím, že zatímco FDecimate() je možné použít pro tradiční decimaci 1-z-N , je pro takové použití pravděpodobně lepší zůstat u Decimate() , protože nevyžaduje nastavení prahové hodnoty detekce duplikátů, když se použije v režimu mode=0.

Tato verze podporuje YUY2 a YV12 pro Avisynth 2.5.

Pokud jste zvědaví čím se FDecimate() liší od vnitřního filtru Avisynthu ChangeFPS(), odpověď je, že FDecimate() může přednostně doručit unikátní snímky, a vyhnout se duplikátům, kde je to možné.

### Jak použít FDecimate()

Pro dosažení dobrých výsledků je důležité nastavit cílovou frekvenci správně a nastavit prahovou hodnotu pro správnou detekci duplikování. Nejdříve uvažujme cílovou frekvenci snímků.

Určení cílové frekvence snímků Pokud jen chcete dosáhnout známé cílové frekvence snímků, můžete prostě vyrazit a nastavit parametr 'rate' na tuto frekvenci. Například, můžete vědět, že zdroj byl 24 fps film. Ale často máme klip s nepravidelnou šablonou duplikátů a my nevíme, jaká by měla cílová frekvence být. To je často případ při zpracování starých němých filmů.

Správná frekvence snímků může být určena použitím následující procedury. Najděte úsek klipu, který je asi deset sekund dlouhý a obsahuje stálý pohyb. Krokujte ve videu bez decimace a zapište si šablonu duplikátů. Například, mohl bych vidět toto:

``

    nový obrázek následovaný jeho duplikátem
    nový obrázek
    nový obrázek následovaný jeho duplikátem
    nový obrázek
    nový obrázek následovaný jeho duplikátem
    nový obrázek
    ...

Mohl bych to zkráceně zapsat takto: 212121... Nyní potřebujeme určit poměr počtu unikátních (neduplikovaných) obrázků k celkovému počtu snímků. Pro opakující se šablonu 212121 bychom měli poměr 2/3. Nemusíte vidět opakující se šablonu, ale nic se neděje. Prostě sečtěte počet unikátních obrázků v desetisekundové periodě a podělte jejich počet celkovým počtem snímků této periody.

Dále vynásobíme poměr určený výše frekvencí snímků nedecimovaného klipu. To dá cílovou frekvenci snímků, která by měla být použita, aby se odstranily všechny duplikované snímky. Můžete obdržet zvláštní frekvenci snímků, která není standardní. Pokud vaše cílové zobrazovací zařízení je počítačový monitor, můžete vybrat takovou zvláštní frekvenci, protože počítač umí zobrazit takovou frekvenci. Ale pokud je vaším cílem TV, budete chtít zaokrouhlit frekvenci na nejbližší standardní frekvenci. Podívejte se do následující kapitoly, "Proč FDecimate() nemůže být dokonalý, a co s tím můžeme dělat", na některé návrhy do budoucna k výběru cílové frekvence snímků.

Určení prahové hodnoty (Threshold) pro detekci duplikátů Pokud váš klip nemá žádné duplikáty a vy ho chcete jednoduše decimovat na nižší frekvenci snímků, tak tento krok nepoužívejte a můžete nastavit parametr 'threshold' na nulu (threshold=0). Pokud váš klip má duplikáty, chcete je přednostně odstranit, a tak FDecimate() potřebuje cestu pro určení které snímky jsou duplikáty.

Proces je následující. Použijte filtr FDecimate() se zapnutými metrikami:

    FDecimate(metrics=true)

To zobrazí metriku rozdílů pro každý snímek (decimace není při metrics=true vykonávána). Prohlížejte si metriku u duplikovaných snímků. Potřebujete najít takové číslo, že metrika pro všechny duplikáty bude nižší, zatímco metrika pro nové obrázky bude vyšší. Toto číslo je prahová hodnota, která by měla být nastavena jako parametr 'threshold' . Je to obvykle něco kolem 1.0-10.0, ale může se lišit podle toho jak je váš klip zašumělý. Je důležité najít dobrou hodnotu pro tuto prahovou hodnotu, takže to dělejte pečlivě a prohlížejte si přitom několik sekcí vašeho klipu.

Vytváření decimovaného výstupu Jakmile byly cílová frekvence snímků a prahová hodnota duplikátů stanoveny, je snadné vytvořit konečný decimovaný výstup. Předpokládejme, že naše cílová frekvence snímků je 20.8 fps, a naše prahová hodnota duplikátů je 2.1, použili bychom výzvu FDecimate() :

    FDecimate(rate=20.8,threshold=2.1)

### Proč nemůže být FDecimate() dokonalý, a co s tím můžeme dělat

Můžete shledat, že FDecimate() nepracuje dokonale s některými klipy. Například, může přeskočit snímek, nebo může ponechat duplikovaný snímek. Lidé občas předpokládají, že by to mělo být perfektní, ale po pečlivém zamyšlení nad tím, můžeme říci, že dokonalost není možná pokud potřebujeme zachovat synchronní audio/video.

Myšlenka, kterou "perfekcionisti" navrhují, je jednoduše zahodit všechny duplikované snímky. Tento proces je úspěšný, t.j., audio/video synchronizace je zachována, pokud je šablona duplikování konzistentní. Ale pokud šablona není konzistentní, a stává se to často, tak je synchronizace kompromisem. Abychom viděli proč, uvažujme tuto šablonu duplikování (skutečně pozorovanou v HD klipu):

    ...3232323232321222212232323232...

Většinu času je klip 323232..., což ukazuje na frekvenci 24 fps pro klip po odstranění duplikátů (frekvence snímků zdroje je 59.94 fps). Ale ve středu je šablona kde počet duplikátů dočasně klesá což znamená rychlejší bázovou frekvenci snímků. Pokud prostě vypustíme všechny duplikáty a zachováme unikátní snímky, budeme přehrávat tuto střední část při 24 fps příliš pomalu. Uvědomte si, že audio je synchronizováno na šablonu před decimací, takže dočasné zpomalení přehrávání povede k audio/video desynchronizaci. Ve skutečnosti šablona výše způsobí desynchronizaci okolo 200 milisekund, což je hodně. Několik takových případů v řadě tak může způsobit rozdíl v sekundách!

(Další problém s myšlenkou prostého vyhození všech duplikátů je, že takové klipy mají často statické části, kde není pohyb. Nechceme je vyhodit! Je představitelné detekovat je a pokusit se je ušetřit ale to je dodatečná komplikace. Vážným problémem je otázka synchronizace popsaná výše.)

Tak můžeme vidět, že v přítomnosti střídání základních frekvencí snímků kvůli nepravidelným šablonám duplikování, zničíme audio/video synchronizaci pokud se pokusíme použít "dokonalý" přístup. Všechno co můžeme opravdu udělat je, vynutit zadanou frekvenci, a pokusit se upřednostnit doručení unikátních snímků před duplikáty, kde je to možné. FDecimate() používá tuto strategii.

Pokud máme takový klip, ve kterém jsou náhodné části, kde je počet duplikátů menší, můžeme při decimování přeskočit dobré snímky. To způsobí postřehnutelné trnutí ve výstupu. Co s tím můžeme dělat? Můžeme využít výhodu skutečnosti, že zvláštní duplikáty jsou méně pozorovatelné než vynechané snímky. Když nastavíme cílovou frekvenci vyšší, zachováme více snímků ze zdroje, a tím snížíme změny přeskakování snímků. Jistě, to zachová více duplikátů, ale je to méně problematické. Pro případ HD klipu výše, jsem schopen nastavit frekvenci snímků 30 fps místo 24 fps a tím dosáhnout rozumných výsledků, a přitom mám stále standardní frekvenci snímků.

Pro úplnost přidám tuto zvláštní poznámku. Je možné, že střídání frekvencí uvedené výše by mohlo být bipolární, t.j, nějaké snížení základní frekvence a nějaké její zvýšení. Zde je příklad:

    32323232222222323232323333333332323232323...

Teoreticky bychom mohli zkusit decimovat dokonale (jak je popsáno výše) a udržet stopu výsledného audia/videa synchronní. Dokud desynchronizace zůstává uvnitř přijatelných mezí, mohli buchom vysílat "dokonalé" výsledky. Pokud desynchronizace překročí meze, měli bychom přeskočit nebo duplikovat snímek. Problém tohoto přístupu je takový, že v praxi nikdy nevídáme takové klipy. Co vidíme, jsou klipy se základní frekvencí náhodně proděravěnou náhlými zvýšeními frekvence (t.j., krátké periody kde není tolik duplikátů jak se předpokládá podle šablony).

Proto jsem přesvědčený, že neexistuje dokonalé řešení pro klipy s náhodným střídáním základní frekvence. Nicméně stále respektuji jakékoliv nové myšlenky, které mohou vylepšit řešení. Nestyďte se mě kontaktovat, pokud máte nějaké nápady pro vylepšení FDecimate().

### Parametry FDecimate()

Následující je syntaxe pro FDecimate() (nahraďte parameter_list vaším , čárkou odděleným seznamem jmenných parametrů):

    FDecimate(parameter_list)

Zde je příklad:

    FDecimate(rate=23.976,threshold=0.8,show=true)

rate (desetinný, výchozí 23.976) Tento parametr nastavuje žádanou výstupní frekvenci snímků. Pro dosažení této frekvence budou z videa odstraněny některé snímky a přitom bude zachována synchronizace audia a videa.

threshold (desetinný, výchozí 1.0) Tento parametr nastavuje prahovou hodnotu rozdílu metrik pro detekci duplikátů. Pokud rozdíl metrik mezi dvěma snímky překročí tuto hodnotu, pak tyto dva snímky jsou považovány za různé snímky, t.j., neduplikované. Podívejte se do kapitoly "Jak použít FDecimate()" výše na vysvětlení jak nastavit tuto prahovou hodnotu správně.

protect (true/false, výchozí false) Tento parametr pomáhá vyhnout se "špatným" snímkům po změně scény. Když je zapnut, zvolený výstupní snímek je porovnán s následujícím (ve vstupním streamu). Pokud je ten následující duplikátem zvoleného, pak je místo něj doručen ten následující.

metrics (true/false, výchozí false) Tento parametr je použit pro určení správné prahové hodnoty použitelné pro detekci duplikátů. Když je nastaven na true, nedojde k žádné decimaci a rozdíl metrik každého snímku se zobrazí ve videu a ve výstupu DebugView. Podívejte se do kapitoly "Jak použít FDecimate()" výše na vysvětlení jak použít tento parametr pro nastavení správné prahové hodnoty.

show (true/false, výchozí false) Tento parametr zapíná zobrazování informací ve snímku. Také zobrazuje verzi softwaru.

Významy čísel jsou následující:

- blind: Volba, která by měla být provedena použitím naivní decimací, bez snahy vyhnout se doručení duplikátů.
- choose: Volba, která by měla být provedena při pokusu vyhnout se duplikátům.
- use: Konečné provedení volby. Pokud je protect false, tak je toto vždy stejné jako choose. Pokud je protect true, tak to může být choose + 1 když je ochrana ve funkci.

debug (true/false, výchozí false) Tento parametr zapíná tisk informací přes OutputDebugString(). Pro zachycení těchto řetězců je dostupná utilita zvaná DebugView. Zobrazované informace jsou stejné jako v možnosti výše.

### Změna výchozích hodnot parametrů FDecimate()

Pokud se vám nelíbí výchozí hodnoty popsané níže, můžete si nastavit své vlastní standardní výchozí hodnoty. Pro přepsání výchozích hodnot, vytvořte soubory výchozích hodnot tak jak je vyžadováno ve složce pluginů Avisynthu. Například nastavte výchozí threshold=2.0 pro FDecimate(), vytvořte soubor pojmenovaný FDecimate.def a vložte do něj tento řádek:

threshold=2.0

Můžete uvést tolik záznamů parametrů kolik budete chtít, na každý řádek jeden. Ty které nebudou zadané budou brát výchozí hodnoty takové jaké jsou uvedeny výše. Samozřejmě vždy můžete přepsat výchozí hodnoty ve vašich skriptech, když vyzvete funkci.
Poznámka: Řádky v souboru výchozích hodnot nesmí obsahovat žádné mezery nebo tabulátory.

Copyright (C) 2008, Donald A. Graft, All Rights Reserved.

Pro aktualizace a další filtry/nástroje, navštivte mou webovou stránku:
http://neuron2.net/

`$English Date: 2004/08/13 21:57:25 $`

`Český překlad:23.3.2009`