# Magické zrcadlo (Vala)

Jak použít svoji webovou kameru jako zrcadlo pomocí základního rámce GStreamer a GTK+.
Daniel G. Siegel
dgsiegel@gnome.org
Johannes Schmid
jhs@gnome.org
Marta Maria Casetti
mmcasetti@gmail.com 2013

# Magické zrcadlo

      Spadlo vám ze zdi zrcadlo a rozbilo se na tisíc kousků a vy se zrovna nutně potřebujete oholit nebo si udělat make-up! A máte jen 15 minut, než vám pojede autobus do práce. Co teď?
      V této lekci napíšeme program, který vám umožní používat webovou kameru jako zrcadlo. Naučíte se tyto věci:

        Vytvořit aplikaci GTK+
        Přistupovat k webové kameře pomocí knihovny GStreamer a výsledek vložit do okna
        Pořídit fotografie vaší webovou kamerou

      Abyste mohli pokračovat v této lekci, budete potřebovat následující:

        Nainstalovanou kopii IDE Anjuta
        Nainstalované kopie knihoven GTK a Gstreamer a kompilátoru jazyka Vala
        Základní znalosti o objektově orientovaných programovacích jazycích

# Vytvoření projektu ve studiu Anjuta

Než začnete s kódováním, musíte ve studiu Anjuta vytvořit nový projekt. Tím se vytvoří všechny soubory, které budete později potřebovat k sestavení a spuštění kódu. Je to také užitečné kvůli udržení všeho pohromadě.

Spusťte IDE Anjuta a klikněte na Soubor Nový Projekt, aby se otevřel průvodce projektem.

Na kartě Vala zvolte GTK+ (jednoduchý). Klikněte na Pokračovat a na několika následujících stránkách vyplňte své údaje. Jako název projektu a složky použijte maginc-mirror.

Ujistěte se, že Použít GtkBuilder k tvorbě uživatelského rozhraní je vypnuto, protože jej chceme v této lekci vytvořit ručně. Na použití návrháře uživatelského rozhraní se podívejte do lekce Kytarová ladička.

Ujistěte se, že Konfigurovat externí balíčky je zapnuto. Na následující stránce vyberte v seznamu gstreamer-0.10, aby se knihovna GStreamer zahrnula do vašeho projektu.

Klikněte na Použít a vytvoří se vám projekt. Otevřete src/magic_mirror.vala na kartě Projekt nebo Soubor. Měli byste vidět kód, který začíná řádky:

using GLib; using Gtk;

# Prvotní sestavení kódu

Kód načte (prázdné) okno ze souboru s popisem uživatelského rozhraní a zobrazí jej. Dále to podrobněji rozebereme. Pokud jste již pochopili základy, tak tento seznam můžete přeskočit:

Dva řádky `using` importují jmenné prostory, takže je nebudeme muset výslovně uvádět.

Konstruktor třídy `Main` vytvoří nové okno a nastaví jeho název pro záhlaví. Potom je okno zobrazeno a je napojen signál, který ukončí aplikaci, když je okno zavřeno. Více o signálech si řekneme později.

Statická funkce `main` se spustí jako výchozí, když spustíte aplikaci napsanou v jazyce Vala. Volá pár funkcí, které vytvoří třídu `Main` a nastaví a spustí aplikaci. Funkce `Gtk.main` spustí hlavní smyčku GTK, která spustí uživatelské rozhraní a začne naslouchat událostem (jako je kliknutí nebo zmáčknutí klávesy).

Kód je připravený k použití, takže jej můžete zkompilovat kliknutím na Sestavit Sestavit projekt (nebo zmáčknutím Shift F7).

Změňte Konfiguraci na Výchozí a klikněte na Spustit, aby se nakonfigurovala složka, ve které se provádí sestavení. Stačí to udělat jen jednou, pro první sestavení.

# Přístup pomocí GStreamer k vysílání videa z webové kamery

Základní multimediální konstrukce GStreamer umí zpracovávat video z webových kamer. Pojďme přidat GStreamer do naší aplikace a můžeme pak přistupovat k videovysílání.

using GLib; using Gtk;

public class Main : Object { private Gst.Element camerabin;

public Main () { this.camerabin = Gst.ElementFactory.make ("camerabin", "camera"); this.camerabin.set_state (Gst.State.PLAYING); }

static int main (string[] args) { Gtk.init (ref args); Gst.init (ref args); var app = new Main ();

Gtk.main ();

return 0; } }

Nejprve odstraníme okno, které jsem před tím vytvořili, protože GStreamer se o zobrazení obrázku na obrazovce postará.

Nyní vytvoříme prvek GStreamer, který zajistí přístup k webové kameře. Použijeme prvek Camerabin, což je prvek „vše v jednom“ – umí pořizovat fotky, videonahrávky, na vše nasadit efekty a mnoho dalšího. Pro naše použití přímo ideální. Pomocí `this.camerabin.set_state (Gst.State.PLAYING)` řekneme rouře, že to co jsme právě vytvořili, má začít s přehráváním. Snadné ne?

Mohli bychom samozřejmě video integrovat těsněji s dalšími okny, ale to je již pokročilé téma zahrnující podrobnosti o systému X Window, do čehož se zde pouštět nebudeme.

Kód znovu přeložte a spusťte. Měli byste skončit se dvěma okny. V dalším kroku začleníme video do okna GTK+.

# Ukázková implementace

Pokud v této lekci narazíte na nějaké problémy, porovnejte si svůj kód s tímto ukázkovým kódem. Je zde i rozsáhlejší realizace, která vkládá okno do běžného Gtk.Windows, což zahrnuje některé pokročilé techniky a přidává tlačítka pro spuštění/zastavení obrázků.

# Co dalšího si přečíst

Jestli si chcete o programování v jazyce Vala najít něco více, můžete se podívat na výuku jazyka Vala.

# Závěr

A je to, podařilo se vám vytvořit plně funkční aplikaci s webovou kamerou během 15 minut. Nyní se můžete oholit a udělat si make-up na svoji krásnou tvář před tím, něž strávíte hezký den ve své práci, kde můžete oslnit své přátele a kolegy úžasnou aplikací, kterou jste právě za 15 minut stvořili.