# Magic mirror (Vala)

Use your webcam as a mirror using the GStreamer framework and GTK+
Daniel G. Siegel
dgsiegel@gnome.org
Johannes Schmid
jhs@gnome.org
Marta Maria Casetti
mmcasetti@gmail.com 2013

# Magic mirror

      Your mirror just fell off the wall and broke into a thousand pieces — but you need a mirror to shave your beard off or add some makeup! You only have 15 minutes left before catching the bus to work. So what can you do?
      Dans ce tutoriel, nous allons faire un programme qui va vous permettre d'utiliser votre webcam comme miroir. Vous apprendrez comment :

        créer une application GTK+,
        accéder à votre webcam en utilisant GStreamer et intégrer le résultat dans une fenêtre,
        récupérer des photos de votre webcam,

      Vous avez besoin de ce qui suit pour pouvoir suivre ce tutoriel :

        l'installation du paquet Anjuta IDE,
        l'installation des paquets GTK, GStreamer et d'un compilateur Vala,
        des connaissances de base d'un langage de programmation d'objets.

# Création d'un projet dans Anjuta

Avant de commencer à programmer, vous devez ouvrir un nouveau projet dans Anjuta. Ceci crée tous les fichiers qui vous sont nécessaires pour construire et exécuter votre programme plus tard. C'est aussi utile pour tout regrouper en un seul endroit.

Lancez Anjuta et cliquez sur Fichier Nouveau Projet pour ouvrir l'assistant de création de projet.

Choose GTK+ (simple) from the Vala tab, click Forward, and fill out your details on the next few pages. Use guitar-tuner as project name and directory.

Désactivez Utiliser GtkBuilder pour l'interface utilisateur car nous allons créer l'interface utilisateur manuellement. Consultez le tutoriel Accordeur de guitare à propos de l'utilisation du constructeur d'interface GtkBuilder.

Assurez-vous que Configuration des paquets externes est activé. Sur la page suivante, sélectionnez gstreamer-0.10 dans la liste pour inclure la bibliothèque GStreamer à votre projet.

Cliquez sur Appliquer et votre projet est créé. Ouvrez src/miroir_magique.vala depuis l'onglet Projet ou l'onglet Fichiers. Vous devez voir apparaître du code commençant par les lignes :

using GLib; using Gtk;

# Première construction du programme

Le programme charge et affiche une fenêtre (vide). Vous trouverez plus de détails ci-dessous ; passez cette liste si vous comprenez les bases :

Les deux lignes `using` importent des espaces de noms que nous n'aurons plus à nommer explicitement.

Le constructeur de la classe principale `Main` crée une nouvelle fenêtre et définit son titre. Ensuite, la fenêtre est affichée et un signal permettant de quitter l'application est connecté à la fermeture de la fenêtre. Plus d'informations sur les signaux sont données plus tard.

La fonction statique `main` est exécutée par défaut quand vous lancez une application Vala. Elle appelle d'autres fonctions qui créent la classe « Main », initialise et ensuite exécute l'application. La fonction `Gtk.Main` démarre la boucle principale GTK, qui lance l'interface utilisateur et commence à écouter les événements (comme des clics de souris ou des appuis sur des touches).

Le programme est prêt à être utilisé, donc vous pouvez le compiler en cliquant sur Construire Construire le projet ou en appuyant sur Maj F7.

Pour configurer le répertoire de compilation, modifiez la Configuration à Par défaut et cliquez sur Exécuter. Il ne faut le faire qu'une seule fois, à la première compilation.

# Accès au flux vidéo de votre webcam avec GStreamer

L'architecture multimédia de GStreamer sait gérer les vidéos en provenance de webcams. Ajoutons GStreamer à notre application et nous pouvons ainsi accéder au flux vidéo.

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

Enlevons d'abord la fenêtre créée précédemment, car GStreamer va gérer l'affichage de l'image à l'écran.

Créons maintenant un élément GStreamer qui va accéder à notre webcam. Nous utilisons l'élément « Camerabin », qui est un élément caméra tout-en-un et qui sait faire des photos, des vidéos, appliquer des effets et beaucoup plus encore. Parfait dans notre cas ! Avec `this.camerabin.set_state (Gst.State.PLAYING)` nous disons au pipeline GStreamer, que nous venons de créer, de commencer la lecture. Facile, non ?

Bien sûr, il est aussi possible d'ajuster plus précisément la vidéo dans d'autres fenêtres, mais c'est un sujet avancé, qui inclut des détails sur le système X Window et que nous ne traiterons pas ici.

Compilez et exécutez le programme à nouveau. Vous obtenez finalement deux fenêtres. À l'étape suivante, nous allons intégrer la vidéo dans la fenêtre GTK+.

# Implémentation de référence

Si vous rencontrez des difficultés avec ce tutoriel, comparez votre programme à ce programme de référence. Il existe aussi une implémentation plus complète qui intègre la fenêtre à une fenêtre standard Gtk, mais qui nécessite des techniques avancées ainsi que l'ajout de boutons pour lire/arrêter l'image.

# Documentation complémentaire

Pour en savoir plus à propos de la programmation en langage Vala, consultez le manuel Vala.

# Conclusion

Ça y est ; vous avez réussi à créer une application fonctionnelle pour webcam en 15 minutes. Maintenant, vous pouvez vous raser ou maquiller votre joli visage avant de passer une belle journée sur votre lieu de travail, où vous allez pouvoir épater vos amis et collègues avec une application géniale faite en 15 minutes.