Vidéo en direct sur site internet

Bonjour,
Je suis entrai de faire une gestion de mon thermostat de chaudière avec le RPI. J’aurais besoin sur la page web d’une image en direct du thermostat. J’ai chargé et installé mediamtx. Mais ensuite je cale un peu. J’ai trouvé plein de page web sur le sujet mais cela diverge fr’anchement de l’une à l’autre. J’utilise une camera rpi (pas une webcam) et un RPI4. j’utilise la commande:

libcamera-vid -t 0 --inline --width 640 --height 480 --framerate 10 | ffmpeg -f h264 -i - -vcodec copy -f rtsp rtsp://192.168.1.111:8554

mais ça ne marche pas.
Merci de votre aide.
Michel

Solution simple que j’utilise pour mes caméras de sécurité.

Install « motion » (pas motion eyes qui est un OS complet) il va prendre en charge la caméra et la rendre disponible en stream.

Vu que ton RPI est en Local, il faut un adresse IP dédié, ou installer un serveur de diffusion sur ton serveur Web

Si tu as un VPS, c’est simple, sinon tu peu te servir de youtube pour diffuser directement, simplement mettre la vidéo en privé si tu ne veux pas être dans les recherches. Si tu as un serveur, Web, moi je conseil d’utiliser le « obselète » mais pratique FFServer (3.4 avec FFMpeg 3.4 pour la compatibilité)

Pour accéder à ton stream, Tu va prendre le flux « http://localhost:8080 » qui est un format MJpeg standard, et tu va le pointer soit vers ton serveur à toi, soit Youtube (ChatGPT peut t’aider avec ça)

Si tu veux pointer le stream directement depuis le RPi, il faudra lui assigner une IP ou un HOST statique et faire la redirection de ports concerné (8081).

Alors en réponse plus complètes…
Tu install « motion » avec sudo apt update -y && sudo apt install motion -y (MaJ + Install automatique). Motion sera sur le port 8081 mais qu’en local, il faudra éditer avec sudo nano /etc/motion/motion.conf pour le rendre accessible a l’extérieur du « local », et ajuster quelques valeurs pour prendre en charge la bonne caméra, qui sera le /dev/video0 en principe.

  1. Solution direct depuis le RPi
    • Tu défini un port et le redirige vers l’adresse local et son port local du RPi. Par exemple le port externe est 5673, mais tu le redirige en lcocal sur le ip 192.168.1.111 au port 8081 .
    • Assure toi d’avoir une adresse IP statique (qui change jamais) ou un nom de domain associé à ton système (Dynamic DND soit un DDNS ou DynDNS), avec certains routeur/gateway tu as l’option, sinon le service de no-ip.com peut être une solution.
    • Tu ajoute un tag image pour lire; <img src="http://hoststatique:5673" />
  2. Tu stream sur Youtube,
    • Il faut créer un stream « live »
    • Demander à CHatGPT la commande pour récupérer http://localhost:8081 et le diriger vers le stream de youtube (avec user/pass, etc… et demande s’y de te faire un script de reconnection en cas d’arrêt du stream, avec une pause) (je n,ai pas la commande sous la main, mais il me la fait voila quelques semaines)
    • Intégrer le lien de partage « embed » de Yotube sur ton site
  3. Créer ton serveur de diffusion
    • Télécharge le FFMPeg et FFServer en version 3.4 , version Linux linux-arm64 ou linux-armhf en 32bits plus compatible
      FFbinaries - Download binaries for ffmpeg, ffprobe, ffserver and ffplay (cross-platform: Windows, Mac, Linux)
    • Extract les fichiers ffserver et ffmpeg dans le même dossier, pour utiliser ffmpeg qui est dans ce dossier, sans retirer celui installé par le OS, il faut passer les commande avec le chemin complet OU depuis ce dossier. par exemple si tu met tout dans « cameras » dans le dossier « home » de l’utilisateur « pi », tu l’atteind par « /home/pi/cameras/ffmpeg ».
    • Tu créer un script pour démarrer le serveur Et le stream de la caméra.
    • Script pour gérer les caméras et el server (cameras.sh)
#!/bin/bash
PATH=/usr/local/bin/:$PATH
RETVAL=1

start() {
case "$1" in
  0)
        startServer
        ;;
  1)
        startStreamA
        ;;
  *)
	startServer
    startStreamA 1
esac
}
stop() {
case "$1" in
  1)
        stopStream A
        killStream 1
        ;;

  *)
		stopServer
esac
}
startServer() {
        echo -n $"Starting Camera server: "
		screen -h 1024 -dmS CamServer /home/pi/cameras/ffserver -f /home/pi/cameras/ffserver.conf &
        echo
        #return $RETVAL		
}
startStreamA() {
		echo -n $"Starting Stream on #6 : "
  		screen -h 1024 -dmS CameraStreamF /home/pi/cameras/ffmpeg -loglevel quiet -fflags discardcorrupt -i http://192.168.1.11:8081 -s 720x480 -r 30 -an http://127.0.0.1:8090/camera1.ffm &
        echo
        #return $RETVAL
}
stopServer() {
        echo -n $"Stopping Camera server: "
        screen -X -S CamServer quit
        echo
        #return $RETVAL		
}
stopStream() {
        echo -n $"Stopping Camera $1 : "
        screen -X -S CameraStream"$1" quit
        echo		
        #return $RETVAL		
}
killStream() {
        echo -n $"Killing Camera $1 : "
        sudo pkill -i -f /camera$1.ffm
        echo		
        #return $RETVAL		
}
restart() {
    stop $1
	start $1
}
ase "$1" in
  start)
        start $2 $3
        ;;
  restart)
        restart $2
        ;;
  stop)
        stop $2
        ;;
  *)
        echo $"Usage: webcam {start}{restart}{stop}"
        RETVAL=2
esac
exit $RETVAL
  • Ta config de FFServer (ffserver.conf)
# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.
#Port 8090
HTTPPort 8090
RTSPPort 8554
# Address on which the server is bound. Only useful if you have
# several network interfaces.
#BindAddress 0.0.0.0
HTTPBindAddress 0.0.0.0
RTSPBindAddress 0.0.0.0
# Number of simultaneous HTTP connections that can be handled. It has
# to be defined *before* the MaxClients parameter, since it defines the
# MaxClients maximum limit.
MaxHTTPConnections 20000

# Number of simultaneous requests that can be handled. Since FFServer
# is very fast, it is more likely that you will want to leave this high
# and use MaxBandwidth, below.
MaxClients 10000

# This the maximum amount of kbit/sec that you are prepared to
# consume when streaming to clients.
MaxBandwidth 10000000

# Access log file (uses standard Apache log file format)
# '-' is the standard output.
#CustomLog /var/log/ffserver.log

# Suppress that if you want to launch ffserver as a daemon.
#NoDaemon

<Stream stat.html>
	Format status
</Stream>

<Redirect index.html>
	URL https://levelkro.net/
</Redirect>

<Feed camera1.ffm>
	File /tmp/camera1.ffm
	FileMaxSize 8192K
	#ACL allow 127.0.0.1
</Feed>

<Stream camera1>
	Feed camera1.ffm
	Format mpjpeg
	VideoFrameRate 30
	VideoQMin 1
	VideoQMax 15
	VideoSize 720x480
	#VideoSize 928x480
	VideoBitRate 2048
	VideoBufferSize 4096
	#NoDefaults
	NoAudio
</Stream>
<Stream camera1/preview.jpg>
	Feed camera1.ffm
	Format jpeg
	VideoSize 720x480
        #VideoSize 928x480
	VideoFrameRate 5
	Preroll 5
	VideoIntraOnly
	Strict -1
	NoAudio
	NoDefaults
</Stream>
  • Dans mon exemple tout est dans « /home/pi/cameras »
  • Tu exécuter le script (rend le exécutable) avec « ./cameras.sh start » (en étant dans « /home/pî/cameras » , si la caméra arrête, relance la, sans relancer le serveur, avec « ./cameras.sh start 1 ».
  • Visite le http://192.168.1.111:8090/stat.html pour voir l’état du serveur FFServer
  • Ajuste ton Router/Gateway pour
    • Définir une adresse unique au RPi sur ton réseau local, ici 192.168.1.111
    • Si tu héberge localement FFServer
      • Redirection des ports; ajoute le port externe pour 5673 (par exemple) et redirige le vers 192.168.1.111 au port 8090 (ffserver)
      • Assure toi d’avoir une adresse IP statique (qui change jamais) ou un nom de domain associé à ton système (Dynamic DND soit un DDNS ou DynDNS), avec certains routeur/gateway tu as l’option, sinon le service de no-ip.com peut être une solution.
      • Tu ajoute un tag image pour lire; <img src="http://ton-ddns-statique:5673/camera1" /> vu que le format est un MJpeg, tu peu changer, une fois confortable avec cette base, en MP4 si tu veux utiliser un lecteur. De plus si tu appel « /camera1.jpg » ou lieu de « /camera1 », tu aurais qu’une image fix (snapshot) du flux.
    • SI tu install FFServer sur un serveur distant.
      • Modifie les script pour le port 8090 et l’adresse du serveur distant
      • Modifie le script pour que sur le serveur distant tu n’es que la partie pour le serveur, et sur le RPi que la partie pour la caméra. Chacun sera démarré de manière indépendante (server et après caméra :stuck_out_tongue: )
      • Tu ajoute un tag image pour lire; <img src="http://le-serveur-distant:8090/camera1" /> vu que le format est un MJpeg, tu peu changer, une fois confortable avec cette base, en MP4 si tu veux utiliser un lecteur. De plus si tu appel « /camera1.jpg » ou lieu de « /camera1 », tu aurais qu’une image fix (snapshot) du flux.

Le format MJpeg n’est pas supporté par la balise <video>

Utiliser un autre port que celui par défaut évite les scans de ports connu, et brouille les pistes sur la nature de l’application utilisé.

La solution Youtube est la plus simple (2), la solution la plus complexe mais indépendant est la 3 (en local ce n’est pas recommandé), et la solution 1 n’est pas recommandé.

La solution 3 en local et 1 ne sont pas recommandé car tu expose ton adresse IP privé sur internet de manière visible et reconnaissable. Il faut s’assurer d’avoir un réseau sécuritaire et solide. Plusieurs demande en même temps peuvent occasionné des baisse et problème de performances de ta connexion internet. La solution 2 et 3 en externe sont idéal car un seul flux sort de ton réseau et limite donc l’usage de ta bande passante, ton adresse IP est masqué par l’usage de Yotube ou d’un serveur externe déjà pour un utilisation sur internet.

Les solutions ici sont testés par moi et j’opte pour être le plus indépendant possible de service Externe, j’ai mon propre système de DynDNS, un serveur dédié et d’autres système pour mes caméras (j’en ai 8 qui stream du Québec jusqu’en France). Mais il peut exister des projet « all-in-one » et plus facile de mise en route, mais je ne les connais pas.

Merci pour cette super réponse. J’avais hier soir réussi tout seul (pour une fois) à diffuser sur une adresse IP l’image du RPI avec Motion. Le seul défaut c’est le décalage de plusieurs secondes. C’est pour cela que je pensais passer par FFMPEG.