[howto] Camera Pi et streaming Multicast avec vlc [stable]

Les applications du Raspberry Pi en contrôle d'accès, alarme et vidéosurveillance

Modérateur : Francois

Répondre
maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

[howto] Camera Pi et streaming Multicast avec vlc [stable]

Message par maxty01 » dim. 16 nov. 2014 22:56

Bonsoir à tous,

Il est vrai qu'un ancien sujet évoque largement le streaming, dans celui-ci, je vais parler de la même chose mais exécutée différemment.

Pour commencer, je reviens vers vous après la lecture de l'article de François :
http://www.framboise314.fr/une-camera-d ... pberry-pi/

Dans les 129 commentaires laissés à la suite de l'article, on y apprend ceci :

Il possible d'utiliser directement la camera comme une webcam traditionnelle avec le module "bcm2835-v4l2" :

Code : Tout sélectionner

pi@raspberrypi ~ $ sudo modeprode bcm2835-v4l2
Cette commande fonctionne correctement sur mon RPI :

Code : Tout sélectionner

pi@raspberrypi ~ $ ls -lah /dev/video0 
crw-rw---T 1 root video 81, 0 Nov 16 20:17 /dev/video0
On obtient bien le device video0 (0 si vous n'avez pas d'autre webcam connectée avant l'ajout du module ci-dessus).

Dans mon cas, j'utilise ZoneMinder pour mes caméras (je me ferai un plaisir de faire un article dessus dans les prochains jours si je remarque un intérêt pour celui-ci dans vos réponses).
Cependant, ce système de gestion de la vidéo surveillance est assez gourmand, celui-ci ne peut donc tourné correctement sur un RPI, il doit nécessairement fonctionner sur un autre système.
En fait, je ne l'ai pas testé sur un RPI, mais comme il est très gourmand, je n'essayerai pas.

Cette article est également valable (mais non testé) pour tous ceux qui possède un NAS Synology avec la fonction vidéo surveillance.

Mon but donc est d'avoir la vidéo sur mon réseau au format 1024x768 codée en H264 sans utiliser raspivid et ce afin que mon ZoneMinder puisse obtenir et traiter la vidéo.

Voici comment j'ai opéré pour que cela soit possible :

Pour streamer la camera sur le réseau, il existe plusieurs possibilités, dans mon cas, je vais parler des 2 principales : l'unicast et le multicast.

Dans le cas de l'unicast, le client se connecte à la source et le débit sur le réseau ainsi que l’utilisation de CPU de la source augmentent proportionnellement selon le nombre de client, cette technologie est d’ailleurs utilisée par la majorité des fournisseurs de VOD.
Dans le cas du multicast, la source envoie directement le flux sur le réseau ce qui fait que le débit sur le réseau reste constant et ce peu importe le nombre de clients "à l’écoute", cette technologie est d’ailleurs utilisée par la majorité des fournisseurs de TV numérique.
Pour celui ou celle qui le souhaite, je vous ai mis les liens vers les différentes pages Wikipédia des différents protocoles.

Pour lancer VLC en unicast, voici la commande :

Code : Tout sélectionner

pi@raspberri ~ $ cvlc v4l2:///dev/video0:chroma=h264:width=1024:height=768 --sout '#rtp{sdp=rtsp://:8554/}' -vvv
:!: L'option "-vvv" met vlc en mode débug, ce qui fait qu'il écrira beaucoup d'informations.

Ou pour lancer VLC en version multicast (le protocole utilise les adresses de 224.0.0.0 à 239.255.255.255), voici la commande :

Code : Tout sélectionner

pi@raspberri ~ $ cvlc v4l2:///dev/video0:chroma=h264:width=1024:height=768 --sout '#standard{access=udp,mux=ts,dst=239.255.1.2:1234,sap,name="RPIStream"}' -vvv
:!: L'option "-vvv" met vlc en mode débug, ce qui fait qu'il écrira beaucoup d'informations.

Pour lire le flux sur un client VLC en unicast (changer l'adresse IP du RPI : aaa.bbb.ccc.ddd) :

Code : Tout sélectionner

$ vlc rtsp://aaa.bbb.ccc.ddd:8554/
Pour lire le flux sur un client VLC en version multicast :

Code : Tout sélectionner

$ vlc udp://@239.255.1.2:1234/
Ou en cherchant via la liste de lecture de VLC les annonces SAP (Flux réseau) sous "réseau local" avec comme nom de flux "RPIStream".

Attention, si vous coupez le serveur multicast alors que votre client écoute toujours, vous allez remarquer que le client ne s’arrêtera pas d'écouter le flux multicast, n'oubliez pas de le couper manuellement.

Voici un petit résumé de mes observations actuelles :
Avec les commandes en unicast ci-dessus et 1 client, j'obtiens pour l'instance de VLC une utilisation du CPU du RPI de ± 20%, de ± 3.5% de RAM et une utilisation de bande passant réseau de ± 5.50 mbps (+/- 700 ko/s) en wifi.
Avec les commandes en multicast ci-dessus, j'obtiens pour l'instance de VLC une utilisation du CPU du RPI de ± 11%, de ± 3.5% de RAM et une utilisation de bande passant réseau de ± 4 mbps (+/- 500 ko/s) en wifi.

EXPLICATION du [unstable]
J'ai remarqué durant mes différents tests que l'image est parfois instable et ce sans explications, peut-être le codage H264 ou tout simplement VLC.
J'ai également remarqué qu'après un certains temps le RPI freeze en multicast, cela ne m'est arrivé qu'une seule fois, et je n'ai aucune explication sur les raisons de ce phénomène.
Je continue a investiguer sur ces 2 phénomènes et j'espère enlever rapidement le [unstable]

En espérant que ces informations vous soient utiles.
Je vous souhaites une très bonne soirée.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par maxty01 » dim. 23 nov. 2014 12:27

Bonjour à tous,

Visiblement, le sujet ne passionne pas les foules ...
Bref, je ne suis pas ici pour me faire aduler, mais pour partager mon expérience linux, iptv et raspberry pi.

Je reviens donc vers vous après avoir analyser les différents problèmes observés durant mes tests.
EXPLICATION du [unstable]
J'ai remarqué durant mes différents tests que l'image est parfois instable et ce sans explication, peut-être le codage H264 ou tout simplement VLC.
J'ai également remarqué qu'après un certain temps le RPI freeze en multicast, cela ne m'est arrivé qu'une seule fois, et je n'ai aucune explication sur les raisons de ce phénomène.
Je continue a investiguer sur ces 2 phénomènes et j'espère enlever rapidement le [unstable]
Concernant l'image instable, cela s'explique assez facilement : le wifi.
En effet la bande passante utilisée par VLC pour le streaming de la caméra est trop importante pour la carte wifi.
Adaptateur wifi utilisé : Adfruit Ourlink
Une fois le réseau câblé connecté, le problème disparaît.

Par contre, concernant le freeze du RPI, je n'ai toujours pas d'explication rationnelle à fournir, et je le considère maintenant comme stable car je n'ai observé ce phénomène qu'une seule fois et ce durant la création des différentes commandes citées dans le message précédant.

Aussi, je reviens pour un complément d'informations sur les données citées durant mes observations (en multicast uniquement) :
Avec les commandes en multicast ci-dessus, j'obtiens pour l'instance de VLC une utilisation du CPU du RPI de ± 11%, de ± 3.5% de RAM et une utilisation de bande passante réseau de ± 4 mbps (+/- 500 ko/s) en wifi.
L'utilisation de la RAM reste constante à +/- 3.5%.
L'utilisation du CPU reste stable entre 8% et 12%.
L'utilisation de la bande passante varie selon l'image envoyée, peu importe le nombre de client connecté :
Image noire, sans luminosité : 400 ~ 700 kbps.
Image fixe, bonne luminosité : 2.3 ~ 3.5 mbps.
Image animée, bonne luminosité : 3.5 ~ 5.7 mbps.

La prochaine étape :
Créer un script de démarrage standard pour lancer le streaming avec un ou plusieurs fichiers d'options, sans oublier le fichier de log et son logrotate.

Je vous souhaites à toutes et à tous un bon amusement.
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Avatar du membre
mum1989
Messages : 4
Enregistré le : mer. 31 déc. 2014 11:45

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par mum1989 » mer. 31 déc. 2014 11:55

Bonjour, j'avais suivi le tuto http://www.framboise314.fr/une-camera-d ... pberry-pi/ j'ai donc une camera de surveillance depuis quelque temps.

Cependant, je voudrais streamer la vidéo de la camera, dans un navigateur web.
J'utilise pour l'instant cette commande :

Code : Tout sélectionner

raspivid -o - -w 1280 -h 720 -b 500000 -fps 30 -t 9999999 -sa -30 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8554}' :demux=h264
Mais je suis obligé de lancer VLC, ce n'est clairement pas pratique
Je peut utiliser motion et l'intégrer dans une page web mais c'est trop limité pour moi, ce n'est pas fluide.
Après il y a la solution raspistill mais la vidéo est stockée sur la carte mémoire ou sur un autre périphérique, ce que je voudrais éviter pour ne pas réduire la durée de vie de la carte mémoire.


Bref je me demandais si c'était possible d'intégrer dans une page web la vidéo qui résulte de cette commande :

Code : Tout sélectionner

"cvlc v4l2:///dev/video0:chroma=h264:width=1024:height=768 --sout '#rtp{sdp=rtsp://:8554/}' -vvv"

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par maxty01 » mer. 31 déc. 2014 12:30

Bonjour,

J'avoue que je ne comprends pas très bien la finalité de ton projet, si tu pouvais me donner plus de détails, par exemple un schéma ou une mise en pratique avec le minimum de details techniques.

Voici déjà un début de réponse, de ce que j'ai compris de ton projet :

Pour écrire ce sujet, j'ai consulté cette page (en français) qui regroupe quelques techniques avancées pour VLC.

Dans cette page, il y a un paragraphe regroupant quelques commandes pour une diffusion HTTP, mais je doute quelle corresponde à tes besoins.

Une autre solution serai d'installer apache2 sur ton RPI et d'y écrire une page HTML, PHP ou encore CGI (au choix donc) en y intégrant une balise image qui pointe vers le flux de la camera.
Mais comme le flux est en H.264, je ne pense pas que la balise image accepte de le format.

Aussi, pour information concernant la commande que j'utilise actuellement, j'ai descendu la résolution de 1024x768 à 800x600 pour une meilleure fluidité.

Avec un maximum d'information concernant ton projet, je pourrais affiner mes réponses.

Bonne journée,
Bien à toi,
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Avatar du membre
mum1989
Messages : 4
Enregistré le : mer. 31 déc. 2014 11:45

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par mum1989 » mer. 31 déc. 2014 13:07

ok, oui je n'ai peut être pas été bien clair.

J'ai donc une camera de surveillance, sauf que je l'utilise autrement

J'ai rajouté un projecteur dessus pour éclairer un parc, il est commandé par un GPIO du Raspberry pi.
J'ai un serveur web sur le raspberry pi.

J'active la caméra et le projecteur depuis un site web,
Ensuite je regarde la camera avec le logiciel VLC.

voici le code :

Code : Tout sélectionner

<!DOCTYPE html>
<html>
  <head>
    <title>RaspCam</title>
    <meta charset="utf-8"/>
    <link rel="stylesheet" href="style.css" type="text/css" />
	<link rel="icon" type="image/png" href="images/camera.png" />
	<link rel="apple-touch-icon" sizes="76x76" href="images/apple-touch-icon-76x76.png">
  </head>

  <body>
    <div id="sidebar">
      <h1>RaspCam</h1>
      <h2>La caméra à base de Raspberry Pi</h2>
      <div id="menu">
        <a class="active" href="index.php">Accueil</a>
        <a href="radio.php">Radio</a>
        <a href="temperature.php">Température</a>
		<a href="infos.php">Infos</a>
      </div>
    </div>

    <div id="content">
      <h1>Accueil</h1>
      <h2>Activer/Désactiver la caméra</h2>

      <br/><br/>
	  <form action="index.php" method="GET">Qualité :
		<input type="radio" name="video" value="on" <?php if($_GET['video'] != "off") { echo 'checked'; }?> />Élevée
		<input type="radio" name="video" value="lowRes"/>Faible
		<input type="radio" name="video" value="web"/>WEB
		<br/><br/>
		<input type="submit" style="border:1px solid #000; font-size:50px;" value="on"/>
		<input type="submit" name="video" style="border:1px solid #000; font-size:50px;" value="off"/>
	  </form>
<?php
	$video = $_GET["video"];
  
	if ($video == "on"){
		exec("/home/pi/Cam.sh on > /dev/null &");
	}
	if ($video == "lowRes"){
		exec("/home/pi/Cam.sh lowRes > /dev/null &");
	}
	if ($video == "web"){
		exec("/home/pi/Cam.sh web > /dev/null &");
	}
	if ($video == "off"){
		exec("/home/pi/Cam.sh off > /dev/null &");
	}
	usleep(100000);
	echo "<br/><br/>";

	$etat = exec ("gpio -g read 23");
	if ($etat){
		echo '<img src="/images/on.png" alt="on"/>';
	}
	else{
		echo '<img src="/images/off.png" alt="off"/>';
	}
	?>
	<br/><br><br/><br><br/><br>
	<a href="/tmp/" style="font-size:20px;">Version LIVE !</a>
    </div>
  </body>
</html>
et le cam.sh

Code : Tout sélectionner

#!/bin/bash

gpio -g mode 23 out

if [ "$1" = "on" ]; then
	gpio -g write 23 1
	raspivid -o - -w 1280 -h 720 -b 500000 -fps 30 -t 9999999 -sa -30 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8554}' :demux=h264 (flux vidéo avec vlc  "haute qualité" -b correspond au bitrate; la qualité)
elif [ "$1" = "lowRes" ]; then
	gpio -g write 23 1
	raspivid -o - -w 640 -h 480 -b 50000 -fps 24 -t 9999999 -sa -30 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8554}' :demux=h264 (flux vidéo avec vlc "basse qualité")
elif [ "$1" = "web" ]; then
	gpio -g write 23 1
	raspistill -w 1024 -h 768 -q 10 -o /tmp/image.jpg -tl 1000 -t 9999999 -sa -30                      # me permet de voir une image toute les secondes de la camera directement sur la page web
else
	gpio -g write 23 0
	killall vlc
	killall raspistill
	rm /tmp/image.jpg
fi
Le but serait d'éliminer VLC, pour avoir une vidéo directement sur le site web, mais je n'ai pas trouvé de solution convaincante.


J'accède à la camera sur tout types de support, tablette, Smartphone, pc.
Si je ne trouve pas mieux, tant pis, je continuerai avec vlc.
Modifié en dernier par mum1989 le mer. 31 déc. 2014 13:33, modifié 1 fois.

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par maxty01 » mer. 31 déc. 2014 13:19

Bonjour,

Ok, j'y vois plus clair.

Je vais analyser plus en profondeur la problématique afin d'y trouver des solutions. (patiente donc)

Aussi, je trouve ton projet très intéressant, et à mon avis, il mériterai un sujet dans ce forum.
Si tu a le temps et le courage, peux-tu écrire un sujet sur ton projet, le tout, en attendant que je décortique ta demande.

Bonne journée,
Bien à toi,
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Avatar du membre
mum1989
Messages : 4
Enregistré le : mer. 31 déc. 2014 11:45

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par mum1989 » mer. 31 déc. 2014 13:32

Merci beaucoup.

Effectivement le projet est sympa, et j'hésite en fait à soit :
- tout publier en open source
- soit vendre ma solution ^^, mais elle reste encore à perfectionner.


Au final mon projet m'a couté environ 120€, et il est fonctionnel depuis plus d'un an.

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par maxty01 » mer. 31 déc. 2014 14:15

Bonjour,

Je tiens juste à rappeler un point légal:

Vu que l'ensemble (ou en grande partie) des outils techniques que tu utilises sont en Open Source, soit sous GPLv2 ou GPLv3.
Il t'es interdit de revendre le système sans les sources.

Par contre, il t'es possible, comme le font la majorité des sociétés Open Source, c'est de faire payer la main d’œuvre, les pièces et surtout le support.

Donc, la première solution est valable, et permet d'avoir une communauté autour de ton "produit", ainsi que son support. De plus, tu peux le faire en tant que "personne" et tu garde la propriété intellectuelle de tes sources.
La seconde est légalement difficile, de plus, tu devra la faire automatiquement en tant que "société".

PS : ceci est un avis belge, je ne sais pas du coté français.
PS 2 : Si je dis une bêtise, que la communauté me rattrape.

Bonne journée,
Bien à vous,
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

maxty01
Modérateur
Messages : 790
Enregistré le : dim. 16 nov. 2014 20:53
Localisation : Charleroi - Belgique

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par maxty01 » mer. 31 déc. 2014 14:50

(re)Bonjour,

Vu que tu envoies déjà ton flux en http, as-tu déjà essayé d'insérer la balise HTML <img src="127.0.0.1:8554></img>" dans ta page ?

Il est également possible d'heberger sur le RPI un lecteur écrit en javascript.
J'ai trouvé jwplayer mais il est visiblement payant.
J'ai trouvé jplayer, mais pas testé.
Il en existe sans doute d'autre ...

Il est aussi possible d'intégrer VLC dans le code HMTL... mais non testé :

Code : Tout sélectionner

<embed type="application/x-vlc-plugin"
pluginspage="http://www.videolan.org"version="VideoLAN.VLCPlugin.2"  width="100%"        
height="100%" id="vlc" loop="yes "autoplay="yes" target="http://127.0.0.1:8554/"></embed>
source

Si tu n'obtiens pas la vidéo, essaye en mettant l'adresse IP de ton RPI.

Si le plugin fonctionne (même si tu n'obtiens pas la vidéo), tu peux essayer de lancer le stream de la vidéo en RTSP (ne pas oublier d’insérer le module noyau "bcm2835-v4l2" pour utiliser la commande) :

Code : Tout sélectionner

cvlc v4l2:///dev/video0:chroma=h264:width=1024:height=768 --sout '#rtp{sdp=rtsp://:8554/video.mp4}'
ou en version 800x600:

Code : Tout sélectionner

cvlc v4l2:///dev/video0:chroma=h264:width=800:height=600 --sout '#rtp{sdp=rtsp://:8554/video.mp4}'
Et en y intégrant la vidéo dans le plugin comme ceci :

Code : Tout sélectionner

<embed type="application/x-vlc-plugin"
pluginspage="http://www.videolan.org"version="VideoLAN.VLCPlugin.2"  width="100%"
height="100%" id="vlc" loop="yes "autoplay="yes" target="rtsp://127.0.0.1:8554/video.mp4"></embed>
N'oublie pas de changer l'adresse IP si la "127.0.0.1" ne fonctionne pas.

Si cela ne fonctionne toujours pas, la majorité des infos que j'ai lu préconisent l'utilisation du "transcode" de VLC, le seul hic, c'est que le RPI n’apprécie pas beaucoup le transcodage ...
Pour faire du transcode, il faut une puissance de calcul et une mémoire vive plus importantes.

J'espère que cela t'aidera.

Bonne journée,
Bien à toi
Il n'y a pas de question stupide, il n'y a que des imbéciles qui ne posent pas de question !
RaspBerry Pi : 1 x B+ Raspbian 1 x RPI2 MiniBian
Mieux me connaître ? Regarder mon LinkedIn

Avatar du membre
mum1989
Messages : 4
Enregistré le : mer. 31 déc. 2014 11:45

Re: [howto] Camera Pi et streaming Multicast avec vlc [stabl

Message par mum1989 » sam. 3 janv. 2015 20:06

Vu que l'ensemble (ou en grande partie) des outils techniques que tu utilises sont en Open Source, soit sous GPLv2 ou GPLv3.
Il t'es interdit de revendre le système sans les sources.


Par contre, il t'es possible, comme le font la majorité des sociétés Open Source, c'est de faire payer la main d’œuvre, les pièces et surtout le support.
Oui,
seulement je ne veux pas que quelqu'un vende ma solution avant que je la mette en place ^^. (je parle du matériel et du support )
Donc, la première solution est valable, et permet d'avoir une communauté autour de ton "produit", ainsi que son support. De plus, tu peux le faire en tant que "personne" et tu garde la propriété intellectuelle de tes sources.
La seconde est légalement difficile, de plus, tu devra la faire automatiquement en tant que "société".

PS : ceci est un avis belge, je ne sais pas du coté français.
PS 2 : Si je dis une bêtise, que la communauté me rattrape.
Et ce ne sont pas les sources que je veux cacher, mais seulement le projet en gros.


Jwplayer utilise flash player, ça va être difficile sur Smartphone/Tablette.
Et en y intégrant la vidéo dans le plugin comme ceci (... )
Effectivement ça peut fonctionner

Finalement, ça m'a donné une idée,
j'ai trouvé une parade,
j'ai mis un liens sur le site qui lance directement VLC avec l'adresse ip de la vidéo, c'est plus facile pour l'utilisateur.
Et je détecte la plateforme (android, ios etc...) en récupérant l'user agent du navigateur pour lancer la commande appropriée.

Répondre

Retourner vers « Accès, alarme et vidéosurveillance »