# Magisk spegel (Vala)

Använd din webbkamera som en spegel med GStreamer-ramverket och GTK+
Daniel G. Siegel
dgsiegel@gnome.org
Johannes Schmid
jhs@gnome.org
Marta Maria Casetti
mmcasetti@gmail.com 2013
Sebastian Rasmussen
sebras@gmail.com 2019
Anders Jonsson
anders.jonsson@norsjovallen.se 2021

# Magisk spegel

      Din spegel föll ner och gick i tusen bitar — men du behöver en spegel för att raka skägget eller sminka dig! Du har bara 15 minuter innan bussen till jobbet går. Vad ska du göra?
      I denna handledning kommer vi göra ett program som låter dig använda din webbkamera som en spegel. Du kommer lära dig hur du:

        Skapar ett GTK+-program
        Kommer åt din webbkamera med GStreamer och bäddar in resultatet i ett fönster
        Får bilder från din webbkamera

      Du behöver följande för att kunna följa denna handledning:

        En installerad kopia av den integrerade utvecklingsmiljön Anjuta
        Installerade kopior av GTK, GStreamer och en Vala-kompilator
        Grundläggande kunskap i ett objektorienterat programmeringsspråk

# Skapa ett projekt i Anjuta

Innan du börjar koda kommer du behöva konfigurera ett nytt projekt i Anjuta. Detta kommer skapa alla filer som du behöver för att bygga och köra koden senare. Det är också användbart för att hålla allting samlat.

Starta Anjuta och klicka på Arkiv Ny Projekt för att öppna projektguiden.

Välj GTK+ (enkel) från fliken Vala, klicka på Framåt, och fyll i dina detaljer på de nästkommande sidorna. Använd magic-mirror som projektnamn och katalog.

Inaktivera Använd GtkBuilder för användargränssnitt då vi kommer skapa användargränssnittet manuellt i denna handledning. Se handledningen Gitarrstämmare för användning av gränssnittsbyggaren.

Säkerställ att Konfigurera externa paket är valt. På nästa sida, välj gstreamer-0.10 från listan för att inkludera GStreamer-biblioteket i ditt projekt.

Klicka på Verkställ så kommer projektet skapas åt dig. Öppna src/magic_mirror.vala från flikarna Projekt eller Filer. Du bör se kod som börjar med raderna:

using GLib; using Gtk;

# Bygg koden för första gången

The code loads an (empty) window and shows it. More details are given below; skip this list if you understand the basics:

De två `using`-raderna importerar namnrymder så vi inte behöver namnge dem explicit.

The constructor of the `Main` class creates a new window and sets its title. Afterwards the window is shown and a signal is connected which quits the application if the window is closed. More on signals later on.

The static `main` function is run by default when you start a Vala application. It calls a few functions which create the Main class, set up and then run the application. The `Gtk.Main` function starts the GTK main loop, which runs the user interface and starts listening for events (like clicks and key presses).

Denna kod är klar att användas, så du kan kompilera den genom att klicka på Bygg Bygg projekt (eller trycka Skift F7).

Change the Configuration to Default and then press Execute to configure the build directory. You only need to do this once, for the first build.

# Kom åt webbkamerans videoström med GStreamer

GStreamer-multimediaramverket kan hantera video från webbkameror. Låt oss lägga till GStreamer till vårt program så vi kan komma åt videoströmmen.

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; } }

Först tar vi bort fönstret vi skapade tidigare, för GStreamer kommer ta hand om att visa bilden på skärmen.

Now we are creating a GStreamer element which accesses our webcam. We are using the Camerabin element, which is an all-in-one camera element and is capable of taking photos, videos, applying effects and much more. Perfect for our use case! With `this.camerabin.set_state (Gst.State.PLAYING)` we tell the GStreamer pipeline we just created to start playing. Easy, no?

Of course it is also possible to integrate the video more tightly into other windows but that is an advanced topic that includes some details of the X Window System we will omit here.

Compile and run it again. You will end up with two windows. In the next step we will integrate the video into the GTK+ window.

# Referensimplementation

If you run into problems with the tutorial, compare your code with this reference code. There is also a more extensive implementation that embeds the window into a regular Gtk.Window which involves some advanced techniques, and adds buttons to start/stop the picture.

# Vidare läsning

För att lära dig mer om programmeringsspråket Vala kan du vilja ta en titt på Vala-handledningen.

# Avslutning

That's it, you have managed to create a full-featured webcam photo application in 15 minutes. Now you can shave your beard off or add some makeup to your beautiful face, right before having a beautiful day at your workplace, where you can impress your friends and colleagues with an awesome application you just made in 15 minutes.