# AviSynth, video s proměnnou frekvencí snímků (vfr) a hybridní video

Existují dva druhy videa z pohledu snímkové frekvence. Konstantní snímková frekvence (cfr) videa a proměnná snímková frekvence (vfr) videa. Pro cfr mají snímky konstantní dobu trvání, a pro vfr mají snímky proměnnou dobu trvání. Většina editačních programů (včetně VirtualDubu a AviSynthu) předpokládá, že video má cfr. Jednou z příčin je, že avi nepodporuje vfr. To se v nejbližší budoucnosti nezmění z různých důvodů . I když avi kontejner nepodporuje vfr, je několik kontejnerů (například mkv, mp4 a wmv), které podporují vfr.

Hybridní video je běžně definováno jako provedený mix materiálu, který byl zpracován pomocí pull-down a materiálu který tak zpracován nebyl (kde může být pulldown provedeno na polích, jako ve standardním 3:2 pulldown, nebo na plném snímku). Není důležité zda je pulldown tvrdý (pole/snímky jsou duplikovány před kódováním) nebo měkký (přidáním příslušných znamení ve streamu, který udává která pole/snímky by měly být při přehrávání duplikovány). Takže to může být buď cfr nebo vfr. Tak je hybridní video jednoduše video s různými základními snímkovými frekvencemi (například 8, 12, a 16 fps ve kterých jsou často kresleny animované filmy. Základní snímková frekvence je frekvence před jakýmkoliv pulldown. Co dělá hybridní videa náročnými, je nutnost rozhodnout, jakou konečnou frekvenci snímků použít.

## Obsah

- Video s proměnnou frekvencí snímků a hybridní video
- Jak rozpoznat vfr obsah (mkv/mp4)
- Otevření hybridního videa (MPEG-2) v AviSynthu a jeho překódování
  - kódování do cfr - 23.976 fps nebo 29.97 fps
  - kódování do cfr - 120 fps
  - kódování do vfr - mkv
  - kódování do vfr - mp4
  - shrnutí
- Otevření jiných hybridních videí než MPEG-2 v AviSynthu a jejich překódování
  - otevření avi vfr obsahu - 120 fps - v AviSynthu
  - otevření jiného než avi vfr obsahu v AviSynthu
  - kódování videa se 120 fps
  - převádění vfr na cfr avi pro AviSynth
  - kódování do MPEG-2 vfr videa
- Audio synchronizace
- Odkazy

## Proměnná frekvence snímků a hybridní video

Je důležité pochopit, že video je obvykle v cfr. Je jeden příklad, kde je převod na vfr velmi užitečný, a tou je hybridní video. Hybridní video je video složené z částí založených na různých frekvencích snímků (například 8, 12, a 16 fps ve kterých jsou kresleny některé animované filmy). Nejběžnější příklad hybridního videa sestává z částí, které jsou prokládané/progresivní NTSC (29.97 fps) a jiných částí jako je FILM (převedený pomocí telecine z 23.976 fps do 29.97 fps). Pro měkký pulldown, je NTSC část (také nazývaná jako video část) přehrávána rychlostí 29.97 fps a část zpracovaná pomocí telecine také duplikováním polí (pro zvetšení snímkové frekvence z 23.976 fps na 29.97 fps). Pro tvrdý pulldown, je to přehráváno rychlostí 29.97 fps bez přidávání jakýchkoliv polí.

Příklady hybridního videa zahrnují mnoho moderních animovaných TV seriálů, řadu Sci-Fi TV seriálů, jako Stargate: SG1, Star Trek: TNG, a Babylon 5), a mnoho "Making Of" (přídavných) dokumentů zařazených na DVD..

Balík TIVTC je vytvořen pro bezeztrátovou práci s hybridním videem, zatímco balík Decomb využívá pro převod do cfr postupy skrze smíchání.

## Jak rozpoznat vfr obsah (mkv/mp4)

Zde je několik způsobů jak určit, že video v kontejnerech mkv/mp4 je vfr:

mpeg-2: DGIndex hlásí procentní zastoupení Film/Video, což může říci kolik hybridního obsahu má soubor zpracovaný mírným pulldown. Nefunguje to však s tvrdým pulldown, a není vždy přesný pokud je smíchán silný/mírný pulldown.

mkv: získají se časové kódy souboru s použitím mkv2vfr.

mp4: pomocí mp4dump (z MPEG4 tools by MPEG4ip package). Otevřete příkazový řádek a napište (s příslušnou cestou)

    mp4dump -verbose=2 holly_xvid.mp4 > log.txt

Otevřete log soubor, a podívejte se na výstup jako zde (najděte atom stts obsahující dobu trvání každého snímku):

    type stts
           version = 0 (0x00)
           flags = 0 (0x000000)
           entryCount = 41 (0x00000029)
            sampleCount = 3 (0x00000003)
            sampleDelta = 1000 (0x000003e8)
            sampleCount[1] = 1 (0x00000001)
            sampleDelta[1] = 2000 (0x000007d0)
            sampleCount[2] = 3 (0x00000003)
            sampleDelta[2] = 1000 (0x000003e8)
            sampleCount[3] = 1 (0x00000001)
            sampleDelta[3] = 2000 (0x000007d0)
            etc ...

sampleDelta ukazuje jak dlouho jsou snímky zobrazovány a sampleCount říká kolik je takových snímků. Tedy ve výše uvedeném příkladu:
3 snímky jsou zobrazeny po dobu 1000 (tzn. každý z nich)
1 snímek je zobrazen po dobu 2000
3 snímky po dobu 1000
1 po dobu 2000
etc ...

Hodnoty času nejsou v sekundách, ale v jakýchsi "ticks", které můžete přepočítat na sekundy pomocí "timescale" hodnoty. Tato "timescale" hodnota je uložena v timescale atomu video stopy (přesvědčte se, že se díváte na správný timescale pro vaši stopu, protože každá stopa má vlastní timescale). Podívejte se na výstup jako zde:

    type mdia
        type mdhd
    ...
         timeScale = 24976 (0x00006190)
         duration = 208000 (0x00032c80)
         language = 21956 (0x55c4)
         reserved = <2 bytes> 00 00

V tomto příkladu je timeScale 24976. Většina snímků má délku 1000. 1000/24976 = 0.04 což znamená, že každý snímek z prvních tří 3 je zobrazen po dobu 0.04 sekund, což je ekvivalent pro 25 fps (1/25 = 0.04). Další snímek má délku 2000. 2000/24976 = 0.08 což znamená, že je zobrazen po dobu 0.08 sekund, což je ekvivalent pro 12.5 fps (1/12.5 = 0.08). atd ...

Log soubor výše, pochází z videa, které je skutečně hybridní.

## Otevření MPEG-2 hybridního videa v AviSynthu a jeho překódování

Předpokládejme, že máte hybridní video, je několik způsobů jak ho zakódovat. Jsou uvedeny níže. Prvním způsobem je převést ho na cfr video (buď 23.976 nebo 29.97 fps). Druhým je zakódovat ho se 120 fps s použitím avi kontejneru a vypuštěním snímků (kde zdvojené snímky jsou vypuštěny při přehrávání). Třetím je vytvořit skutečné vfr s použitím mkv nebo mp4 kontejneru.

### kódování do cfr (23.976 fps nebo 29.97 fps)

Pokud vybereme rychlost videa, video sekvence budou OK, ale FILMové sekvence se budou lehce zadrhávat (kvůli zdvojeným snímkům). A podobně, pokud vybereme rychlost FILMu, FILMové sekvence budou OK, ale video sekvence se budou zadrhávat (kvůli "chybějícím" snímkům). Navíc, když zakódujeme s 29.97 fps, dostaneme nižší kvalitu při stejné velikosti souboru, protože je o 25% větší počet snímků. Vybrat si z nich není snadné. Pokud je klip převážně FILMový měli by jste zvolit 23.976 fps, a pokud je klip převážně VIDEO měli by jste zvolit 29.97 fps. Zdroj je také faktorem. Pokud je většina videočástí zcela statická například "mluvící hlavy", měli by jste být schopni "decimovat" na 23.976 fps bez nějakého zřetelného zadrhávání při přehrávání.

Když vytvoříte váš d2v projektový soubor uvidíte, že klip je většinou video (NTSC) nebo FILM (v informačním panelu). Nicméně, řada těchto hybridů je kódována zcela jako NTSC, s filmovými částmi zpracovanými "tvrdým telecine" (pole zpracované zvlášť pomocí telecine už také byla kódována) takže budete muset pečlivě prověřit zdroj aby jste zjistili co máte, a jak si s ním přejete zacházet.

Pluginy Avisynthu Decomb a TIVTC poskytují dva speciální decimační režimy pro lepší práci s hybridními klipy pomocí smíchání. Rychle ujídá datový tok, ale ukazuje se jako velmi hladký. Zde je typický skript pro zapnutí tohoto režimu:

    Telecide(order=0, guide=1)
    Decimate(mode=X) # nastaví "threshold" pro detekci film/video

nebo

    TFM(mode=1)
    TDecimate(mode=0,hybrid=X) # nastaví "vidThresh" pro detekci film/video

Jsou 2 faktory, které umožňují vhodné zpracování filmových a ne-filmových částí pomocí Decimate. První, když Telecide udává guide= 1, je schopen předat informaci pluginu Decimate o tom, které snímky jsou získané z film a které z videa. Pro tento mechanismus práce, musí Decimate ihned následovat Telecide. Je jasné, že čím lépe (cestou nastavení parametrů) dokáže Telecide rozpoznat typ, tím lepší práci Decimate může udělat.

Druhý faktor je prahová hodnota. Pokud v posloupnosti snímků nejsou duplikované snímky, pak je s touto posloupností zacházeno jako s videem. Prahová hodnota určuje jaké procento rozdílu snímků je přípustné pro duplikování. Všimněte si že prahová hodnota - threshold= 0 vypne druhý faktor.

Nezapomeňte nastavit správné pořadí polí - DVD mají obecně order= 1, a zachytávané video má obecně order= 0. Zahrnutý DecombTutorial?.html vysvětluje jak určit pořadí polí.

Převážně filmový materiál (mode=3)

Když je klip většinou film, chceme decimovat filmové části normálně, takže budou hladké. Pro nefilmové části, chceme zmenšit jejich frekvenci snímků směsnou decimací každého cyklu snímků od 5 snímků do 4 snímků. Takto rendrované video sekvence vypadají hladší než když jsou decimovány jako film. Pro tento režim práce nastavte Decimate na mode= 3, nebo TDecimate na hybrid= 1.

Jiný IVTC plugin byl vyvinut speciálně pro práci s hybridním materiálem bez smíchaných snímků: je to SmartDecimate. Získané výsledné snímky budou "čisté", ale při přehrávání nebudou tak plynulé a výsledek bude trochu víc zadrhávat než výsledek z Decomb. Typický skript je zde:

    B = TDeint(mode=1) # nebo KernelBob(order=1)
    SmartDecimate(24, 60, B)

Aby byl zachován přehrávaný výsledek co nejhladší , provádí se před tím odstranění prokládání pomocí "Smart Bobb".

Převážně video materiál (mode=1)

Když je klip tvořen převážně video částí chceme se vyhnout decimaci video částí abychom zachovali co nejhladší přehrávání. U filmové části , chceme ponechat stejnou snímkovou frekvenci jako má video, ale zaměníme duplikované snímky smíchanými snímky,aby nebyly duplikáty viditelné. Nastavte Decimate na mode= 1, nebo TDecimate na hybrid= 3 pro takové zpracování.

V tomto případě smíte také zvážit jestli necháte klip prokládaný a tak ho také zakódujete, obzvlášť když ho budete později sledovat na TV.

### kódování do cfr - 120 fps

Budete pro to potřebovat TIVTC a avi_tc. Začněte vytvořením decimovaného avi s timecodes.txt, ale přeskočte muxing. Pak otevřete tc-gui's tc2cfr tab a přidejte vaše soubory nebo použijte tento příkazový řádek:

    tc2cfr 120000/1001 c:\video\video.avi c:\video\timecodes.txt c:\video\video-120.avi

Pak spojte (muxujte) s vaším audiem. To funguje protože tc2cfr vytvoří avi s vypuštěnými snímky vyplněním zvláštního prostoru vynechanými snímky pro vytvoření hladkého avi se 120fps.

### kódování do vfr (mkv)

Nejdříve si stáhněte mkvtoolnix. Použijete ho k muxování vašeho videa do MKV kontejneru s regulačním souborem timecode. Přesvědčte se, že máte poslední verzi (1.6.0 v době psaní tohoto článku), protože starší vydání četly timecody nesprávně.

Je několik pluginů pro AviSynth , které můžete použít pro generování VFR videa a požadování timecode souboru. Níže je uveden příklad s použitím pluginu Decomb521VFR . Další alternativou je plugin TDecimate obsažený v balíku TITVC . Podívejte se do jejich příslušné dokumentace, aby jste se dozvěděli více o jejich nastavení.

Plugin DeDup odstraňuje duplikované snímky, ale nemění snímkovou frekvenci (nechává trhavé video pokud není nejdřív decimované), takže nemůže být zahrnutý. Stále může být použit po jiné metodě s použitím jejích timecodů jako vstupu pro DeDup.

Decomb521VFR:

Přidejte následující do vašeho skriptu:

    Decomb521VFR_Telecide(order=1, guide=0)
    Decomb521VFR_Decimate(mode=4, threshold=1.0, progress=true, timecodes="timecodes.txt", vfrstats="stats.txt")

Otevřete tento skript ve VirtualDubu, vytvoří se timecody a statistické soubory pro kódování. Zpočátku se bude zdát, že zamrzne, protože při prvním načtení zkouší každý snímek.

TIVTC

Toto je 2 průchodový (2-pass) režim. Přidejte do vašeho skriptu toto:

    TFM(mode=1,output="tfm.txt")
    TDecimate(mode=4,output="stats.txt")

Otevřete a přehrajte celé video ve VirtualDubu. Pak ho zavřete, okomentujte tyto řádky (nebo spusťte druhý skript) a přidejte:

    TFM(mode=1)
    TDecimate(mode=5,hybrid=2,dupthresh=1.0,input="stats.txt",tfmin="tfm.txt",mkvout="timecodes.txt")

Načtěte a zakódujte.

framerate

Pokud kódujete na zadanou velikost s použitím bitrate kalkulátoru, vfr decimace zaneřádí kalkulaci. Aby znovu pracovala přidejte do vašeho skriptu následující:

Před decimací:

    oldcount = framecount # tento řádek musí být před decimací
    oldfps = framerate

Konec skriptu:

    averagefps = (float(framecount)*float(oldfps))/float(oldcount)
    AssumeFPS(averagefps)

muxing

Nyní muxujte do MKV:

1. Otevřete mmg.exe (grafické prostředí pro mkvmerge)
2. Přidejte váš soubor s video streamem
3. Přidejte váš soubor s audio streamem
4. Klikněte na importovanou video stopu
5. Vyhledejte soubor "timecodes.txt"
6. Klikněte na audio stopu
7. Pokud vaše audio už potřebuje zpozdit, nastavte zpoždění
8. Spusťte muxování

Pro přehrávání tohoto formátu potřebujete Matroska splitter. Pro AVC budete potřebovat Haali Splitter, ale pro ASP můžete použít Gabestův Splitter.

### kódování do vfr (mp4)

Pokud vytvoříte avi se 120 fps s vypuštěnými snímky, tak muxované mp4 stejně odstraní tyto snímky při kódování s jakýmikoliv n-vops vytvořenými enkodérem a zůstane hybridní. Východiskem je kódovat vícenásobné avi soubory (některé s 23.976 fps-film a některé s 29.97 fps-video) a spojit je přímo do jednoho vfr mp4 souboru pomocí mp4box a volbou -cat.

Třetí, mnohem jednodušší metodou je enkódovat pomocí metody MKV a pak video zpracovat pomocí tc2mp4: více podrobností k tc2mp4 najdete na [Doom9 forums].

### souhrn metod

Po shrnutí všech výhod a nevýhod zmíněných metod, lze říci že při kódování do 23.976 nebo 29.97 fps bude klip cfr (což editory jako AviSynth a Virtualdub potřebují), ale může to při přehrávání vypadat trhaně kvůli duplikování některých chybějících snímků. Tomu se lze vyhnout smícháním, ale enkodéry pak nepracují tak dobře. Při kódování do 120 fps s použitím vypuštěných snímků, je klip cfr, a nezadrhává při přehrávání, a je velmi kompatibilní. Kódování do mkv s použitím true vfr (použití timecodes) neztrácí ani neduplikuje snímky, ale není tak rozšířené jako široce podporované AVI.

## Otevření jiných hybribních videí než MPEG-2 v AviSynthu a jejich překódování

Je možné otevřít v AviSynthu hybridní video i bez ztráty synchronizace videa a zvuku: použitím DirectShowSource. Nejběžnější formáty podporující hybridní video (vfr) jsou mkv, mp4, wmv, a rmvb, a níže popsané metody pracují se všemi; nicméně pokud je zdroj mkv, můžete také použít mkv2vfr a AviSource.

### otevření jiného než-avi vfr obsahu v AviSynthu

Nejlepší způsob jak dostat všechny snímky se zachováním synchronizace zvuku a časováním je převést na běžnou snímkovou frekvenci, jako 120 fps pro 24/30 (nebo raději 119.88). (Vždy použijte convertfps=true, což přidává snímky jako ChangeFPS, jinak se vaše audio desynchronizuje.

    DirectShowSource("F:\Hybrid\vfr.mp4", fps=119.88, convertfps=true)

Můžete to také otevřít jako 30p, což musí být následně re-decimováno, ale týká se to málo snímků, nebo 24p, porušením 30p sekcí:

Překódování do 23.976 nebo 29.97 fps:

    DirectShowSource("F:\Hybrid\vfr.mkv", \
       fps=29.97, convertfps=true) # nebo fps=23.976

nebo

    DirectShowSource("F:\Hybrid\vfr_startrek.mkv", \
       fps=119.88, convertfps=true)
    FDecimate(29.97) # nebo FDecimate(23.976)

Dalším způsobem je najít průměrnou snímkovou frekvenci (podělením celkového počtu snímků délkou v sekundách) a použít tuto rychlost v DirectShowSource. V závislosti na délce budou přidávány nebo vypouštěny snímky pro zachování synchronizace, a to téměř zaručuje zadrhávání. DirectShowSource nebude provádět telecine.

### překódování 120 fps videa

Nejsnadnější cestou k převodu vfr zdrojů zpět na vfr v AviSynthu je použití DeDup:

1. průchod:

    DupMC(log="stats.txt")

2. průchod:

    DeDup(threshold=.1,maxcopies=4,maxdrops=4,dec=true,log="stats.txt",times="timecodes.txt")

TIVTC to může udělat také:

1. průchod:

    TFM(mode=0,pp=0)
    TDecimate(mode=4,output="stats.txt")

2. průchod:

    TFM(mode=0,pp=0)
    TDecimate(mode=6,hybrid=2,input="stats.txt",mkvout="timecodes.txt")

Jakmile zakódujete váš soubor, muxujte ho zpátky do mkv nebo 120 fps avi.

Objeví se všechny duplikované snímky a vkládané directshowsource, při zachování počtu snímků a velmi podobném časování. Ale nepoužívá se stejný soubor timecode ze vstupního videa, použije se nový. Tyto soubory nemusí být identické. (Samozřejmě si můžete pohrát s parametry pokud chcete použít více funkcí dedup.)

### převod vfr do cfr avi pro AviSynth

Můžete se vyhnout analyzování a decimaci použitím speciálních nástrojů pro dosažení minimální konstantní-frekvence avi pro zásobení avisynthu. Po zpracování a překódování, použijte tc2cfr nebo mmg na výstupu s originálními timecody pro opětovné získání vfr a plné synchronizace. (Pokud provádíte nějaký druh decimace nebo změnu snímkové frekvence budete muset editovat váš timecode soubor sami, i když má dedup timesin parametr.)

avi

avi_tc vytvoří timecode a normální video, pokud avi použije vynechné snímky a ne n-vop nebo plně kódované snímky. To také vyžaduje aby nebyly přítomny žádné audio nebo jiné další stopy. Pro jeho použití otevřete tc-gui a přidejte váš soubor, nebo použijte následující příkazový řádek:

    cfr2tc c:\video\video-120.avi c:\video\video.avi c:\video\timecodes.txt 1

mkv

mkv2vfr extrahuje všechny video snímky z Matroska do normálního AVI souboru a timecodového souboru. Funguje jen, když je mkv ve vfw-režimu. Příkazový řádek pro použití mkv2vfr je:

    mkv2vfr.exe input.mkv output.avi timecodes.txt

### kódování do MPEG-2 vfr videa

http://forum.doom9.org/showthread.php?t=93691

Ještě jsem se na to nepodíval, takže nemohu komentovat/připomínkovat.

## Audio synchronizace

Po prohlédnutí všech metod pro kódování Vašeho hybridního videa (na 23.976, 29.97 nebo vfr video) se můžete ptát, proč vaše audio zůstane synchronní a přitom nedotčené těmito metodami, které použijete pro kódování vašeho videa. Před kódováním mají video a audio stejnou délku, takže na počátku jsou synchronní. Mohou nastat následující dvě situace:

- změníte frekvenci snímků streamu jejich urychlením nebo zpomalením (jak je často děláno při převodech PAL-FILM). To předpokládá, že se změní délka video streamu, a proto se desynchronizuje audio stream.
- změníte frekvenci snímků streamu přidáním nebo odebráním snímků. To předpokládá, že délka video streamu zůstane stejná, a proto audio stream bude synchronní.

Pokud kódujete video stream na 23.976 nebo 29.97 fps (oba cfr) s použitím Decimate(mode= 3, threshold= 1.0) nebo Decimate(mode=1, threshold= 1.0), budou snímky přidány nebo odstraněny, a proto váš audio stream bude synchronní. Podle podobné úvahy bude vfr kódování také synchronní.

Nakonec předpokládejme, že otevřete vfr video v AviSynthu pomocí DirectShowSource. Srovnejte následující

    DirectShowSource("F:\Hybrid\vfr_startrek.mkv", \
       fps=29.97) # nebo fps=23.976

a

    DirectShowSource("F:\Hybrid\vfr_startrek.mkv", \
       fps=29.97, convertfps=true) # nebo fps=23.976

V prvním případě bude porušena synchronizace od 24p sekcí, protože je video urychleno, a v druhém případě bude synchronní, protože jsou přidány nebo odstraněny některé snímky kvůli převodu na cfr.

Na dopracování:

- http://forums.animesuki.com/showthread.php?t=34738 http://forum.doom9.org/showthread.php?t=112199 tc2mp4, subs/Aegisub a ffmpegsource pro soubor timecode.
- stažení WMVTIMES.exe.
- subs also: http://forum.doom9.org/showthread.php?t=135889&page=2.
- jak určit zda video (MP4) je vfr nebo není?: http://forum.doom9.org/showthread.php?t=137899.
- Wilbert: Nerozumím komentáři k DeDup v "kódování do vfr (mkv)": potřebuje prozkoumat.
- MP4 and timecodes: dtsedit (open source) and tc2mp4Mod: http://forum.doom9.org/showthread.php?t=146840 http://zoome.jp/VFR_maniac/diary/6/

## Odkazy

Základní informace: Force Film, IVTC, and Deinterlacing and more (článek napsaný některými lidmi na doom9).
Tvorba 120 fps video.
Dokumentace Decomb521VFR.
O pluginu Decomb521VFR1.0 modifikovaný pro automatizovaný Matroska VFR.
Mkvextract GUI od DarkDudae.

Kromě všech lidí, kteří se podíleli na zde zmíněných nástrojích, by chtěl autor tohoto návodu (Wilbert) poděkovat těmto: bond, manono, tritical a foxyshadis - za jejich užitečné návrhy a připomínky k tomuto návodu.

`$English Date: 2009/07/12 12:49:59 $`

`Český překlad:18.9.2009`