Raspberry Pi – Emission d’un flux vidéo pour une lecture sur Android

Raspberry Pi flux vidéo AndroidLe Raspberry Pi est un petit ordinateur vendu pour une trentaine d’euros et qui permet, grâce à son port GPIO de commander divers appareils et circuits électronique. Vous pouvez également y brancher un caméra, soit la caméra « officielle » nommée « Raspberry Pi Camera Board », soit une webcam USB.

Si comme moi, vous souhaitez diffuser l’image de la caméra branchée sur Raspberry Pi, ce tutoriel est fait pour vous.

 

Installation et configuration du paquet permettant de diffuser le flux vidéo

Tout d’abord, nous allons avoir besoin d’installer le paquet « subversion » pour pouvoir récupérer les sources utiles au fonctionnement du « streamer ».

Pour cela, exécutez les commandes suivantes :

sudo apt-get update
sudo apt-get install subversion

Installez ensuite libjpeg8-dev et imagemagick comme ceci :

sudo apt-get install libjpeg8-dev
sudo apt-get install imagemagick

Une fois cette action terminée, allez dans votre dossier personnel comme ceci

cd /home/pi

Il faut ensuite télécharger le streamer. Pour cela, nous allons utiliser « mjpg-streamer ».

Téléchargez-le en exécutant la commande suivante :

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer

Compiler le paquet avec les commandes suivantes :

cd mjpg-streamer
make

Une fois l’opération terminée, vous devriez pouvoir déclencher le streaming sur votre camera.
Si votre caméra est une webcam branchée en USB vous devriez pouvoir l’utiliser directement. Si la caméra est celle du Raspberry Pi (Raspberry Pi Camera Board), vous devriez avoir une erreur.

Pour en être sûr, exécutez la commande suivante :

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

Si l’erreur « ERROR opening V4L interface: No such file or directory » apparait, cela signifie que la caméra n’a pas de drivers et ne peux pas être utilisée comme cela. Si jamais vous n’avez pas utilisé la caméra du Raspberry Pi mais une webcam USB, vous ne devriez pas voir apparaître cette erreur (sauf si votre webcam n’est pas compatible). Passer alors au dernier point de ce tutoriel

 

Installation du driver de la caméra « Raspberry Pi Camera Board »

Il faut tout d’abord installer UV4L, pour cela, nous allons commencer par la clé du dépôt. Exécutez alors la commande suivante :

wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc

Ensuite, avec votre éditeur préféré, il va falloir aller modifier le fichier « /etc/apt/sources.list ». Dans l’exemple suivant, je vais utiliser « vi », mais « joe », « nano » ou un autre éditeur feront également l’affaire :

sudo vi /etc/apt/sources.list

Ajoutez alors dans à la fin de ce fichier la ligne suivante :

deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

Pour les utilisateur de « vi », quittee en appuyant sur « Esc » ou « Echap » sur votre clavier et en tapant « :wq! » puis validez en appuyant sur « Entrée »

Mettez à jour vos paquets grâce à la commande suivante :

sudo apt-get update

Puis installez le paquet uv4l et uv4l-raspicam :

sudo apt-get install uv4l uv4l-raspicam

Le drivers est maintenant installé, il manque cependant un nouveau paquet qui permettra de lancer automatiquement ce driver au démarrage du Raspberry Pi. Pour cela, exécutez la commande suivante :

sudo apt-get install uv4l-raspicam-extras

Il ne reste plus qu’à redémarer le service uv4l_raspicam grâce à la commande suivante :

sudo service uv4l_raspicam restart

Vous pouvez maintenant relancer votre serveur de streaming grâce à la commande :

./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

Si cela ne fonctionne toujours pas (comme c’était le cas pour moi), vous pouvez exécuter la commande de mise à jour du Raspberry Pi:

sudo rpi-update

Puis terminer par un « reboot » pour redémarrer le Raspberry Pi.

Au redémarrage, vous devriez pouvoir utiliser votre Raspberry Pi avec la caméra :

cd /home/pi/mjpg_streamer
./mjpg_streamer -i "./input_uvc.so" -o "./output_http.so -w ./www"

 

Vous accéder maintenant à votre flux en lançant sur votre navigateur préféré sur la page suivante « http://IP_de_votre_Raspberry:8080 »

Egalement dans VLC en ouvrant un flux réseau à l’adresse suivante : « http:// IP_de_votre_Raspberry:8080/?action=stream »

Vous remarquerez que l’action exécutée en invite de commande sur le Raspberry Pi est bloquante. Pour quitter le streaming vidéo, il vous suffit simplement de faire « CTRL + C » sur votre clavier et le streaming est stoppé instantanément. Vous reprenez alors la main sur votre Raspberry Pi.

Pour les adaptes du Raspberry Pi, je ne saurais que vous conseiller le blog Framboise314

Android – Communication avec un Raspberry Pi

Un tutoriel sur la communication entre un terminal Android et un Raspberry Pi. Vous en rêviez, le voici !

Le but de ce tutoriel étant de diffuser un flux caméra depuis le Raspberry Pi et le visualiser sur le terminal Android. Vous pouvez accéder au tutoriel de diffusion du flux vidéo en cliquant ici

Dans un second temps, il y aura également le déclenchement d’actions (sur les broches GPIO) sur le Raspberry Pi depuis le terminal Android. – Publication à venir

Communiquer avec un Webservice

Si comme moi, vous avez beaucoup cherché comment communiquer avec un Webservice depuis une applications Android, cet article est fait pour vous.

Tout d’abord, j’ai récupéré le paquet suivant :LibWebservice
Je l’ai ensuite dé-zippé à la racine du répertoire « src » du projet présent dans mon workspace. Si le projet était ouvert dans votre éditeur Android préféré, il faudra réactualiser ce dernier en appuyant sur la touche « F5 ». Vous devriez maintenant voir apparaitre les nouveaux fichiers dans l’arborescence de votre éditeur.

Il faut créer une classe avec son constructeur prenant comme paramètre l’URL du Webservice.

public class WebService {
    private String URL_globale = "";
    public WebService(String URL)
    {
        this.URL_globale = URL;
    }
}

J’ai ensuite créé une méthode me permettant de tester la connexion avec le WebService. Bien sûr, il faut que la fonction « testConnexion » soit présent dans le Webservice distant et dans notre cas, il faut que cette dernière retourne « OK » si la connexion est correcte.

public boolean tester_la_connexion() throws IOException, XmlPullParserException
{
    final String SOAP_ACTION = "testConnexion";  //Nom de la fonction du Webservice
    final String METHOD_NAME = "testConnexion";  //Nom de la fonction du Webservice
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy);
    // Création de la requête SOAP
    SoapObject request = new SoapObject (NAMESPACE, METHOD_NAME);
    //Ajout de propriété: addProperty(nom de variable, valeur) -> Le nom de la variable vient du Webservice
    request.addProperty("SecureKey", SECURE_KEY);   //Je passe une "secure key" qui permet d'identifier l'application (facultatif)

    //Mise dans l'enveloppe SOAP des données
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (SoapEnvelope.VER11);
    //Préparation de la requête
    envelope.setOutputSoapObject (request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE (URL_globale);

    androidHttpTransport.debug = false;
    //Envoi de la requête
    androidHttpTransport.call (SOAP_ACTION, envelope); //Envoi au Webservice

    Object soapResult =  envelope.getResponse(); //Récupération du résultat
    if(soapResult.toString().equals("OK"))
    {
       return true;
    }
    else
    {
       return false;
    }
 }

A vous d’adapter cette méthode en fonction de vos besoins et de vos fonctions.

Il ne vous reste plus qu’à instancier la classe « WebService » et vous servir de la fonction « tester_la_connexion »