Seznámení s programováním videa v AviSynthu na příkladech

Grafika Seznámení s programováním videa v AviSynthu na příkladech

Podle prvních vět na domácím webu avisynth.org je AviSynth výkonným nástrojem pro video postprodukci. Ale záleží, co si představíme pod pojmem video postprodukce. Hned ze začátku musím říci, že nemá ambice nahradit Media Composer nebo FinalCut. Jeho síla je v možnostech převodů a konverzí mezi různými videoformáty. Dále je schopen pracovat s různými barevnými prostory a převádět je mezi sebou. Víte, že digitální signál vzniká z analogového procesem, který se někdy zjednodušeně nazývá vzorkování (samplování). AviSynth pak umí pracovat s různými typy samplování a rovněž je umí převádět mezi sebou. Ale nečekejte od něj software ze seriálu CSI. Když nějaká informace chybí, nevymyslí si ji. Takže pokud je zdrojem MPEG2 (samplování 4:2:0) a zpracováváte ho v RGB (4:4:4), stále máte barvy stejné jako v původním zdroji, stále mají 4 pixely ve čtverečku vedle sebe stejnou barevnou hodnotu. Lišit se mohou pouze jasem. V neposlední řadě, umí AviSynth pracovat s vrstvami a umí tak poměrně snadno například vkládat různé „kaziznačky“, watermarky, loga, ale i standardní podtitulky přímo do obrazu. Ukážeme si to na příkladech dále.

Co ale AviSynth nedokáže nebo co umí hůře. Tak především je poměrně komplikované pomocí něj provádět střih. Točíte-li filmovým způsobem, před každým záběrem klapku, dlouhý pre i post roll a máte na disku tento hrubý materiál z kamery a chcete ho sestříhat, AviSynth není nejvhodnější. Ne, že by to nešlo, ale je to velmi, velmi pracné. Je to jako byste chtěli psát ručně EDL střihovou soupisku. Také nemám nejlepší zkušenosti s editací videa, které obsahuje audio. Ale možná to je jen tím, že mně osobně to netrápí, protože mám k dispozici ProTools, kde si audio zpracovávám samostatně.

Co k provozu AviSynth potřebujeme

Jelikož je AviSynth vlastně jen proprocesor, který zpracovává avs script, a výstupní video poskytuje klientovi, který s ním následně nějak nakládá, nemá žádné GUI. Jako klienta s dobrým GUI používám VirtualDub. V něm jsou ihned vidět výsledky zpracovávaného scriptu.

Dalším programem, který se mi osvědčil, je specializovaný textový editor AvsP. Nejen, že barevně zvýrazňuje syntaxi, ale i napovídá parametry funkcí. Má vestavěno spoustu velmi užitečných funkcí, včetně náhledu, takže v době psaní ale i ladění scriptu okamžitě vidíte co děláte.

Nyní si na několika příkladech ukážeme práci s AviSynthem. Nebudu zde podrobně popisovat jednotlivé příkazy, na to máte velmi dobrou nápovědu, která se spolu s AviSynth instaluje do počítače.

Příklad 1.

Všichni to známe, točíme své děti při hraní, běžně stříháme v kameře, ale začátek a konec záznamu není úplně „úhledný“. Někdo si natáčí i barevné kalibrační pruhy a nebo dokonce i klapku. Takže potřebujeme odstřihnout začátek, kde jsou neostré a rozklepané sekundy záznamu a pak i konec, který je díky došlé kazetě nesrozumitelný. Proto si na začátek ukážeme velmi jednoduchý skript, který ze vstupního videa odstřihne začátek a konec a na začátku vytvoří roztmívačku a na konci zatmívačku obě dlouhé 12 oken.

avisource("cebr.avi")
trim(74,44378)
fadeio(12)

Příkazem avisource otevřeme video. Příkaz trim pak určuje první a poslední snímek videa. Výsledkem bude video, jehož první snímek je 74 původního videa a poslední 44378. A to včetně. Poslední příkaz říká, že prvních a posledních 12 snímků se postupně prolíná do černé.

Příklad 2.

Moje kamera není už nejmladší, je analogová a když dojde baterie, neumí zcela dobře navázat na předchozí záznam. Uprostřed záznamu je proto jedna technická vada, kterou chceme odstranit. Současně je zde změna prostředí, tak chceme spojení provést prolínačkou.

V tomto příkladě už začneme používat proměnné a napíšeme si jednoduchou funkci Crosfade.

v = avisource("cebr.avi")

function crosfade (clip v1, clip v2, int frames) {
    tempvbegin = v1.trim(0,v1.Framecount()-frames-1)
    tempvend = v2.trim(frames+1,0)
    v1cros = v1.trim(v1.Framecount()-frames-1, 0)
    v2cros = v2.trim(0,frames)
    maskclip = BlankClip(v1cros, color=$FFFFFF).fadeIn(frames)
    tempvcrossfade = v1cros.Overlay(v2cros, mask=maskclip, mode="blend")
    return tempvbegin+tempvcrossfade+tempvend
}

v1 = v.trim(16,23945)
v2 = v.trim(23972,41989)

Crosfade(v1,v2,20)

Jak vidíte, v tomto příkladě ukládáme reference na jednotlivé klipy, či jejich části do proměnných. V proměnné v je celé zdrojové video. Přeskočme část scriptu a soustřeďme se na předposlední dva řádky. Vidíme, že v proměnných v1 a v2 jsou dvě části zdrojového videa. v1 obsahuje video od snímku 16 do snímku 23945 a v2 zdroj od snímku 23976 do snímku 41989. Pokud je chceme jen prostě spojit, stačí na konec napsat řádek

v1+v2

Ale naším záměrem bylo obě části prolnout. Na to jsme si napsali funkci, která prolnutí zajistí. Jmenuje se Crosfade a má tři parametry. Prvním je první část videa, druhým je druhá část videa a třetím je délka prolnutí ve snímcích. Script uvnitř funkce udělá následující kroky. Nejprve rozdělí obě části vstupních videí na části před a po prolínačce (tempvbegin a tempvend) a části, které se překrývají (v1cross a v2cross). Princip prolnutí spočívá v tom, že se jakoby dají obě videa do vrstev na sebe a u horního se postupně změní průhlednost ze 100% na 0%. Průhlednost je dána jasem alfakanálu. Ten si vytvoříme jako bílý videoklip stejné délky jako je samotná prolínačka a pomocí příkazu fadein ho postupně prolneme do černé. Takto vytvořený klip použijeme jako masku v příkazu Overlay. Na závěr sestavíme všechny tři části, začátek, prolínačka a konec, za sebe a vrátíme zpět. Tím je funkce hotová a její použití vidíme na posledním řádku scriptu.

Crossfade v AviSynth

Příklad 3.

Na začátek našeho videa naklíčujeme úvodní titulek. Ten je vytvořen v grafickém editoru a je uložen jako 32bit TIFF s alfa kanálem.

Sice v tomto případě budeme vkládat jen jeden titulek, ale abychom to měli jednodušší příště a protože to už umíme, napíšeme si na to funkci.

function InsertTitle (clip clip, string tiffsource, int begin, int end) {
    subs = imagesource(tiffsource, start=0, end=end-begin, fps=clip.framerate(), pixel_type="rgb32")
    alpha = ShowAlpha(subs).fadeIO(12)
    oclip = clip.trim(begin,end).overlay(subs,mask=alpha, mode="blend")
    return clip.trim(0,begin-1)+oclip+clip.trim(end+1,0)
}

Funkce InsertTitle má čtyři parametry. Prvním je video, do kterého se vkládá titulek, druhý je jméno souboru s titulkem, pak následují čísla snímků od kterého do kterého se titulek zobrazí. Naše funkce obsahuje nové příkazy imagesource, který načítá jeden nebo sérii statických snímků a ShowAlpha, která „vypreparuje“ alfakanál z našeho titulku. Ostatní již známe z naší předchozí funkce crosFade. Princip je podobný, Vstupní video se rozdělí na tři části, před titulkem, po titulku a část do níž se bude titulek vkládat. V řádku, kde se tvoří alfakanál, je použitý již známý příkaz fadeio. Ten je tam proto, aby se titulek postupně vylnul a na konci zas zalnul.

Na konec scriptu pak napíšeme ještě jeden řádek, ze kterého tuto funkci zavoláme.

InsertTitle ("titulek_01.tif", 219, 394, 1)
Titulek videa v AviSynth

Tak a máme hotovo. Náš videozáznam je sestříhaný, doplněný titulkem a obsahuje i jeden drobný trik. Ale co s ním dál?

Nejjednodušší je uložení intermediát videa ve formátu avi přímo ve virtualdubu. Dalšími možnostmi je import AviSynth scriptu přímo do encoderu mpeg, avc nebo vc1. Mezi encodery, které avs podporují jsou například Cinema Craft Encoder, Sonic Cinevision, Canopus ProCoder apod.


 

  Aktivity (1)

Článek pro vás napsal petr
Avatar
Autor se věnuje programování video titulu pro distribuci na DVD, BluRay, ITunes, Netflix a pod.

Jak se ti líbí článek?
Celkem (5 hlasů) :
4444 4


 


Miniatura
Všechny články v sekci
Grafika

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!