Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Filmy a seriály, streamovací služby
Televize  |  Projektory
Audio a domácí kina
Multimediální centra  |  Ostatní
Svět hardware  |  Digimanie
Svět mobilně

AviDemux - VirtualDub pod Linuxem

16.7.2007, Radek Jahoda, recenze
Před časem jsme nakoukli do světa Linuxu a je na čase se k tomuto tématu vrátit. A nelze začít ničím jiným než programem AviDemux. Protože čím je VirtualDub pro uživatele systému Windows, tím je AviDemux pro Linuxovou komunitu. Ovšem tento program existuje i pro BSD, Windows, ale i Macintosh. Není totiž téměř vůbec závislý na službách systému, jako VirtualDub. Další předností je, že pracuje nejen s AVI soubory, přestože je má v názvu, ale i s jinými formáty.
A právě na skripty se teď podíváme. Možná se to nezdá, ale právě skripty rozšiřují značně použití programu. Sice jejich naučení nějakou dobu trvá, odmění se nám ale později při opakovaném zpracování značným urychlením práce. Jak již bylo řečeno, každý projekt AviDemux je skript, který v sobě obsahuje příkazy pro otevření video souboru, vložení filtrů, nastavení parametrů a kodeků.

Skripty jsou od verze 2.1 inspirovány syntaxí ECMAScript, které jsou spíše známy pod pojmem JavaScript. To sice jejich psaní zesložiťuje (oproti starší verzi), značně to rozšiřuje jejich možnosti. Podívejme se na základy, pokusím se vše psát polopatě, aby byl schopen každý napsat požadovaný skript. Největším zdrojem moudrosti ale pro Vás budou uložené projekty, z kterých je nejlépe vycházet a do svého skriptu kopírovat jejich části.

Každý soubor musí začínat touto řádkou:

//AD

První dvě lomítka jsou komentář a písmena AD identifikují typ skriptu, bez ní nebude typ souboru rozpoznán a nebude proveden. Dále již následují samotné příkazy, jako první ale musí být vytvořena instance Avidemux, která nám zprostředkuje všechny potřebné funkce.

var app=new Avidemux();

Zde také vidíme základní syntaxi - var definuje proměnnou (variable), hned za ní je název proměnné, new je operátor pro vytvoření instance a Avidemux je název třídy, každý příkaz musí končit středníkem. Všechny funkce pak budeme volat pomocí

app.název funkce(parametry)

Funkcí není nijak moc, pamatovat si je určitě všechny nebudete, obzvlášť pokud budete psát skripty jen občas, jejich kompletní seznam najdete úplně na konci článku. Zatím se omezme na nejzákladnější příkazy.

Video soubor načteme jednoduše pomocí příkazu

app.load("/media/data/video1.avi");

Další soubor můžeme připojit příkazem

app.append("/media/data/video2.avi");

Po načtení všech souborů můžeme provést sestříhání. Normálně po načtení souborů je nastaveno zpracování všech snímků. Pokud chceme zpracovat jen některé snímky, tak musíme použít segmenty. Segment je rozsah snímků, které budou zpracovávány. K jejich správě jsou dvě funkce.

app.clearSegments();
app.addSegment(0,100,1000);

První řádka s clearSegments vymaže všechny segmenty - žádný snímek tedy nebude zpracováván. Musíme tedy vložit rozsah snímků funkcí addSegment, která má tři parametry. První číslo je pořadové číslo vloženého souboru, počítané od nuly, tedy souboru video1.avi, druhý parametr je pořadové číslo snímku v tomto video souboru a třetí číslo je počet snímků, které chceme použít. Takto můžeme vložit libovolný počet segmentů.

Dále budeme pracovat již přímo s videem nebo zvukem. Všechny funkce pro video jsou odkazovány funkcí (alias třídou) video, u zvuku je to audio. Filtr tak vložíme tímto příkazem:

app.video.addFilter("crop", ,"left=10","right=20","top=30","bottom=40");

První parametr je název filtru (crop pro ořez videa), další parametry jsou již parametry filtru, jistě z nich poznáte nastavení ořezu ze stran.

Dále nastavíme typ komprese, tedy kodeku. Ten vložíme příkazem Codec:

app.video.Codec("FFMpeg4", "2PASS=689");

První parametr je název kodeku, dále následují bližší parametry, v našem případě je to nastavení dvouprůchodové komprese s cílovou velikostí 689MB. Jak kodek, tak i filtry je lepší vkládat zmíněnou kopírovací metodou "cut&paste", tedy uložit si projekt s nastavenými filtry a kodeky a zmíněné příkazy překopírovat do našeho skriptu.

Dostáváme se již k uložení. Nejprve nastavíme výstupní kontejner.

app.setContainer("OGM");

A pak již dáme příkaz k uložení do souboru, který spustí celý proces.

app.save("/media/data/output.ogm");

No a to je vše, co se týká samotného zpracování pomocí AviDemuxu. Skripty ale umožňují daleko více, to se ale už netýká samotného AviDemuxu, ale programování v jazyce ECMAScript alias JavaScriptu. Tím ale neskončíme, ukážeme si asi nejpoužívanější dávkové zpracování všech souborů v jednom adresáři.

Nejprve si vytvoříme funkci, které předáme jako parametr název vstupního a výstupního souboru a do které uzavřeme náš celý výše uvedený proces.

function ProcessFile(vstup, vystup)
{
app.load(vstup);
app.video.addFilter...
app.video.Codec...
app.setContainer...
app.save(vystup);
}

Dále budeme procházet zvolený adresář a pro každý AVI soubor budeme volat naši vytvořenou funkci ProcessFile. K procházení souborů v adresáři se používá třída DirectorySearch, pro výběr souborů pro četní je to fileReadSelect a pro zápis fileWriteSelect. Takže si zadefinujeme instanci pro hledání souborů.

var ds = new DirectorySearch();

A dále provedeme zvolení vstupního a výstupního adresáře - nejprve zadefinujeme proměnné, pak teprve provedeme výběr a pomocí pathOnly získáme pouze adresář.

var VstupniAdr;
var VystupniAdr;
VstupniAdr = fileReadSelect();
VstupniAdr = pathOnly(VstupniAdr);
VystupniAdr = fileWriteSelect();
VystupniAdr = pathOnly(VystupniAdr);

A již přistoupíme k samotné smyčce procházení. Funkce ds.Init initializuje procházení a funkce ds.NextFile vždy vrátí další soubor v adresáři, ds.Close ukončí hledání.

if (ds.Init(VstupniAdr))
{
while (ds.NextFile())
{
if (!ds.isNotFile && !ds.isDirectory)
{
extension=ds.GetExtension();
if (extension == "avi")
{
ProcessFile(VstupniAdr+"/"+ds.GetFileName(),VystupniAdr+"/"+ds.GetFileName());
}
}
}
ds.Close();
}

No a to je vše, co je nutné udělat. Vše uložíme do jednoho souboru.