Interpolace 30 fps videa na 50 fps bez vynechaných snímků + řešení problému s Variable Frame Rate (návod)

Většina běžných consumer zařízení (mobilní telefony, levné foťáky) natáčí video s rychlostí 30 snímků za sekundu. Když ale potřebujete vytvořit video dle evropského standardu s 25 či 50 snímky za sekundu, běžné zpracování vypadá tak, že se každý šestý snímek zahodí – a video nepříjemně zaškubává.

Dá se s tím něco dělat? Ano! Zde je návod jak to vyřešit zadarmo, pomocí volně dostupných aplikací.

Bonus: Odstranění problémů s tím, že většina telefonů neudrží konstantní snímkovou frekvenci („variable frame rate“) a střihovým programům to vadí.

Konverze 30 fps na 25 fps – popis problému

Pokud natáčíte video (bez)zrcadlovkou (či jakoukoli „profi“ technikou), v nastavení si můžete zvolit snímkovou frekvenci, jakou potřebujete. Pokud jste ovšem odkázáni na videa, která vám dodají ostatní, budou to pravděpodobně videa z běžných telefonů či levných kompaktních foťáků. Většina z nich natáčí video v „americkém“ standardu 30 snímků za sekundu (či 29.97) a nejde to snadno změnit – často je z vyšších snímkových frekvencí k dispozici jen „slow motion“ 120 či 240 fps, ale s technickými omezeními (nižší rozlišení, vyšší komprese).

Pokud potřebujete výsledek promítat v „evropské“ normě 25 či 50 fps, máte problém. Konverze 30 fps na 25 fps není triviální a většina střihových programů to vyřeší nejjednodušším možným způsobem – každý šestý snímek zahodí. Výsledek? Pokud kamera panuje, nebo se na plátně děje nějaký větší pohyb, obraz se cuká. Bohužel je to přesně ten typ nepravidelnosti, které lidské oko dobře detekuje.

Správné řešení je samozřejmě natáčet zdrojové materiály v takové snímkové frekvenci, kterou potřebujete na výstupu. Ale pokud to nejde, je tu druhá nejlepší možnost – pohybová interpolace videa z 30 fps na 50 fps.

Než se dostaneme k řešení interpolace, popíšu ještě jeden problém.


Variable frame rate – popis problému

Když natáčíte video zrcadlovkou (či bezzrcadlovkou) nastavenou na 50 fps, dostanete video s 50 snímky každou sekundu a každý snímek následuje po předešlém s odstupem 20 msec (1/50 sec). Stejně tak jsou bezproblémová videa z akčních kamer GoPro.

Ale když natáčíte video běžnými telefony, není to stejné. Telefon říká, že natáčí 29.97 fps, ale ve výsledném videu není 29.97 snímků každou sekundu (2997 snímků na 100 sekund). Je jich tam většinou méně – a to nepravidelně. Většina snímků následuje za sebou s odstupem 1/29.97 sekundy … a pak najednou je mezi dvěma snímky větší časová mezera. Není to tak, že by jeden snímek vypadl a další by tak následoval s odstupem 2/29.97 sec za předešlým – následující snímek často přijde v obecném, ne-synchronním okamžiku.

Když taková videa vložíte do střižny, uvidíte něco takového:

Bez názvu2

Proč to tak je? Procesor telefonu nedělá jen natáčení videa. Čas od času se věnuje nějaké jiné zajímavé činnosti (překreslení uživatelského rozhraní, mobilní komunikaci, běhu aplikací na pozadí, …),  a tak se mu stává, že nestíhá video komprimovat a ukládat. Nedostatek času vyřeší tím, že přibrzdí foťák – zabrání mu v expozici dalšího snímku, dokud nezpracuje předešlý.

Pokud videa nestříháte a jen je bez úprav ukazujete či posíláte ostatním, není žádný problém. Většina přehrávačů Variable Frame Rate (VFR) videa podporuje a přizpůsobí se tempu snímků tak, jak přichází.

Když ovšem chcete z takového materiálu stříhat, situace je odlišná. Velká část střihových programů nemá VFR videa ráda. Často předpokládají, že video má konstantní snímkovou frekvenci, a pokud ji nemá, dochází k problémům – typicky se rozjíždí obraz a zvuk. Už po pár desítkách sekund zdrojového videa je možné mít odchylku několika snímků, což začíná být vidět – často tak, že při detailním pohledu nesedí hlas s pohyby rtů.

Pokud provedete níže popsanou pohybovou interpolaci 30->50 fps, jako vedlejší efekt převedete VFR videa na konstantní snímkovou frekvenci. Dva problémy vyřešené v jedné operaci – to se vyplatí!

Poznámky:

  • Zcela nezávisle na popsaném postupu interpolace je možné VFR problém vyřešit použitím open-source konvertoru videí HandBrake (handbrake.fr). Ve volbě vlastností videa je tam kromě snímkové frekvence též přepínač VFR / constant frame rate – je tedy možné nechat snímkovou frekvenci i rozlišení obrazu „as in source“, beze změny, a jen překódovat VFR klip na CFR.
  • Nepleťte si „Variable frame rate“ s „Adaptive frame rate“, což je funkce novějších lepších telefonů, kdy za dostatečného světla automaticky snímají video v 60 fps, a když je moc tma, a čas pro sejmutí jednotlivých snímků překročí 1/60 sec, automaticky přepnou na 30 fps. Nicméně i video s AFR je většinou VFR.

Pohybová interpolace ze 30 fps na 50 fps – jak to funguje?

Kompresní algoritmy pro video jsou (velmi zjednodušeně!) založeny na tom, že hledají v jednotlivých po sobě následujících snímcích obrazce, které se pohybují. A pak jen zapíší informaci ve stylu „obdélník 24×40 bodů se posunul ze souřadnice 128,204 na souřadnici 145,210 a na levém horním rohu mírně zrůžověl“. Pohybová interpolace pak může z této komprese vycházet – pokud víme, že během N po sobě následujících snímků se objekt X pohyboval po dráze z A do B, lze vygenerovat „mezisnímky“, zachycující objekt v libovolném bodě časové osy.

Profesionální střihové programy tohle samozřejmě umí – ale potřebné filtry stojí balík. Lze to řešit v amatérském prostředí? Překvapivě ano.

Jak na to?

Klíčová kouzla se jmenují AviSynth, mvtools, ffms a ffmpeg.

Instalace:

  1. Nainstalujte AviSynth. Konkrétně jsem použil AviSynthPlus-MT-r2728-with-vc_redist.exe.
  2. Z balíku mvtools (mvtools-2.7.31-with-depans.7z) zkopírujte obsah adresáře x64/ do adresářů AviSynth/plugins64 a AviSynth/plugins64+
  3. Z balíku mvtools zkopírujte obsah adresáře x86 do adresářů AviSynth/plugins a AviSynth/plugins+
  4. Stejný postup pro balík ffms (ffms2-2.23.1-msvc.zip)
  5. Do samostatného adresáře si rozbalte ffmpeg (ffmpeg-20180902-93b35a0-win64-static.zip)

Vytvořte si příkazový soubor pro AviSynth popisující konverzní operaci, nazvěte ho convert-mp4.avs. Na řádku FFmpegSource2 je cesta ke konvertovanému souboru, zde C:\tmp\input.mp4.

#LoadPlugin("c:\Program Files\AviSynth+\plugins\mvtools2.dll")
FFmpegSource2("C:\tmp\input.mp4", vtrack = -1, atrack = -1, timecodes="C:\tmp\timecodes_file.txt")   
# assume progressive PAL 25 fps or NTSC Film 23.976 source
super = MSuper(pel=2)
backward_vec = MAnalyse(super, overlap=4, isb = true, search=3)
# Use block overlap, halfpixel accuracy and Exhaustive search
forward_vec = MAnalyse(super, overlap=4, isb = false, search=3)
MFlowFps(super, backward_vec, forward_vec, num=50, \
   den=1)

No a pak už to stačí spustit. Aplikace ffmpeg dostává cestu k výše vytvořenému souboru .avs a jméno výstupního souboru. V parametru „cfr“ je kvalita výstupu – čím nižší číslo, tím vyšší kvalita (a větší velikost souboru).

ffmpeg -i convert-mp4.avs -c:v libx264 -preset medium -crf 10 -c:a aac -b:a 256k output.mp4

Operace není příliš rychlá, nebuďte překvapeni tím, že to trvá 5x či 10x déle, než je délka videa.

Jaký je výsledek?

Největší problém s resamplingem 30/25 fps je při paningu – pohybu kamery, tedy když se plynule pohybuje většina scény. Ale to je zrovna zároveň nevhodné pro detailní ukázky (při dostatečné časové lupě to není moc vidět), takže jsem připravil dva „umělé“ případy – zejména u toho prvního by v realitě konverze 30/25 moc nevadila, ale zase je to tam dobře vidět.

Zde je první ukázka. Vyrenderoval jsem 50 fps video, kde je stejný zvětšený vystřižek videa vložen v originálním formátu (29.97 fps) a po konverzi. Video je zpomalené 1:50, tedy jeden výstupní snímek trvá 1 sec.

Všimněte si, že dolní obraz se hýbe při každém snímku, horní nepravidelně. Nejsou zde žádné artefakty interpolace, vypadá to přirozeně.

Druhé demo ukazuje totéž ve větším celku. Když budete dobře sledovat nohy běžícího, uvidíte občas artefakty interpolace. Při přehrávání běžnou rychlostí nejsou vidět (mozek je nevnímá – tento typ chyb má tendenci ignorovat) a při promítání na velkém plátně pomáhají k vnímání „plynulosti“ obrazu!

Je to vždy dokonalé a bez problémů použitelné? Samozřejmě, že ne.

Občas jsou artefakty interpolace hodně výrazné. Zejména pokud se v obrazu pohybuje ostře ohraničený, výrazně barevně odlišný objekt. Třeba tady se zdvojil luk:

resampling-spatne

Velmi problémovým materiálem jsou pak videa točená v šeru, s vysokým šumem. Interpolace se snaží interpolovat i náhodný „pohyb“ šumu a výsledek je výrazně horší, než když použijete původní video beze změn.

Nicméně v 97 % případů jsou takto vytvořené klipy bez problémů použitelné. Při promítání na 50 fps zařízení – v mém případě projektor ve velkém kině – je obraz plynulý a netrhá se. Rozdíl proti videu zpracovaném „běžným“ střihovým workflow z 30 fps zdroje je obrovský.

Pokud plánujete promítat videa z 30 fps zdrojů na 50 fps zobrazovači, rozhodně doporučuji tento postup vyzkoušet.

 

Napsat komentář

Filed under Neidentifikované texty

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google photo

Komentujete pomocí vašeho Google účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s