ffmpeg_live_streaming
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
ffmpeg_live_streaming [2025/04/22 20:03] – luc | ffmpeg_live_streaming [2025/04/23 20:29] (Version actuelle) – luc | ||
---|---|---|---|
Ligne 17: | Ligne 17: | ||
* Une connexion ethernet (le cuivre, y'a que ça de vrai) | * Une connexion ethernet (le cuivre, y'a que ça de vrai) | ||
* (facultatif) un serveur web pour centraliser plusieurs Rpi+webcam | * (facultatif) un serveur web pour centraliser plusieurs Rpi+webcam | ||
+ | |||
+ | |||
+ | ===== Principe ===== | ||
+ | |||
+ | Dans les grandes lignes, on va demander à ffmpeg de capturer le flux vidéo depuis la webcam et de l' | ||
+ | On notera que ffmpeg ne peut diffuser que s'il y a un récepteur actif, c'est le serveur nginx qui joue ce rôle, même si aucun client n'est connecté. | ||
+ | |||
===== Installation du Raspberry Pi ===== | ===== Installation du Raspberry Pi ===== | ||
On aura un usage headless, or les versions " | On aura un usage headless, or les versions " | ||
+ | |||
+ | |||
+ | ===== Serveur RTMP (nginx) ===== | ||
+ | |||
+ | Installation : '' | ||
+ | |||
+ | === Configuration en relais RTMP === | ||
+ | |||
+ | On configure nginx, le bloc rtmp doit être à la racine, il ne doit pas être inclus dans le bloc http comme le son les vhost : | ||
+ | < | ||
+ | # nginx.conf | ||
+ | # Configuration de nginx en relais rtmp | ||
+ | rtmp { | ||
+ | server { | ||
+ | listen 1935; # Listen on standard RTMP port | ||
+ | chunk_size 4096; # les paquets feront 4096 octets, le standard | ||
+ | |||
+ | application live { | ||
+ | live on; | ||
+ | record off; | ||
+ | } | ||
+ | | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | On peut envoyer un flux vers le serveur en indiquant son ip `rtmp:// | ||
+ | Le port est facultatif, car nous avons utilisé 1935 qui est le standard. | ||
+ | Le choix de " | ||
+ | Le terme " | ||
+ | |||
+ | On pourrait ensuite se connecter au serveur avec un client comme VLC en indiquant l' | ||
+ | |||
+ | C'est bien, mais on ne peut pas accéder au flux RTMP dans le navigateur (peut-être certains lecteurs media en JS le peuvent, mais je ne les ai pas trouvés) | ||
+ | |||
+ | === Configuration pour servir en HLS === | ||
+ | On va diffuser jusqu' | ||
+ | < | ||
+ | # nginx.conf | ||
+ | # Configuration pour servir le flux en HLS | ||
+ | rtmp { | ||
+ | server { | ||
+ | listen 1935; # Listen on standard RTMP port | ||
+ | chunk_size 4096; # les paquets feront 4096 octets, le standard | ||
+ | |||
+ | application live { | ||
+ | live on; | ||
+ | record off; | ||
+ | |||
+ | # Turn on HLS | ||
+ | hls on; | ||
+ | hls_path / | ||
+ | hls_fragment 3; | ||
+ | hls_playlist_length 60; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | On notera que nous avons choisi de mettre les fichiers écrits par HLS dans un dossier dans la RAM (/dev/shm, pour être plus rapide que sur la carte SD et éviter d'user celle-ci), il convient que ce dossier existe et soit accessible en écriture à l'user du serveur web (www-data ou nginx, selon la config). | ||
+ | |||
+ | Il faut ensuite gérer 2 vhost : un pour le flux HLS, l' | ||
+ | < | ||
+ | # Servir le flux HLS (de simples fichiers, mais avec les headers qui vont bien) | ||
+ | # mon_vhost.conf ou inclus dans le bloc http | ||
+ | server { | ||
+ | listen 8080; | ||
+ | |||
+ | location /hls { | ||
+ | # Disable cache | ||
+ | add_header ' | ||
+ | |||
+ | # CORS setup | ||
+ | add_header Access-Control-Allow-Origin *; | ||
+ | add_header ' | ||
+ | add_header ' | ||
+ | |||
+ | # allow CORS preflight requests | ||
+ | if ($request_method = ' | ||
+ | add_header ' | ||
+ | add_header ' | ||
+ | add_header ' | ||
+ | add_header ' | ||
+ | return 204; | ||
+ | } | ||
+ | |||
+ | types { | ||
+ | |||
+ | application/ | ||
+ | video/mp2t ts; | ||
+ | } | ||
+ | |||
+ | root /dev/shm; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | On notera l' | ||
+ | On notera les directives pour autoriser les flux qui viennent d' | ||
+ | |||
+ | < | ||
+ | # Servir le site web qui contiendra le player (simple fichier html) | ||
+ | # mon_vhost.conf ou autre ou inclus dans le bloc http | ||
+ | |||
+ | # dans un bloc server { }, on peut juste servir le fichier | ||
+ | |||
+ | root / | ||
+ | |||
+ | location / { | ||
+ | add_header Access-Control-Allow-Origin *; | ||
+ | if ($request_method = ' | ||
+ | add_header ' | ||
+ | add_header ' | ||
+ | } | ||
+ | |||
+ | # First attempt to serve request as file, then | ||
+ | # as directory, then fall back to displaying a 404. | ||
+ | try_files $uri $uri/ =404; | ||
+ | } | ||
+ | </ | ||
+ | On notera les entêtes pour les autorisations de CORS (Cross Origins) bla bla... | ||
+ | |||
+ | === Page web avec le lecteur === | ||
+ | On va s' | ||
+ | ``` | ||
+ | < | ||
+ | <html lang=" | ||
+ | < | ||
+ | <meta charset=" | ||
+ | < | ||
+ | <link href="// | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | |||
+ | <video | ||
+ | class=" | ||
+ | controls | ||
+ | preload=" | ||
+ | width=" | ||
+ | height=" | ||
+ | data-setup=" | ||
+ | > | ||
+ | <source src=" | ||
+ | <p class=" | ||
+ | To view this video please enable JavaScript, and consider upgrading to a | ||
+ | web browser that | ||
+ | <a href=" | ||
+ | > | ||
+ | > | ||
+ | </p> | ||
+ | </ | ||
+ | |||
+ | <script src=" | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | ``` | ||
+ | On notera l'url vers le flux HLS configuré précédemment. | ||
+ | |||
+ | |||
+ | Voilà, on a ce qu'il faut pour consommer le flux video, il faut maintenant le capturer, c'est le travail de ffmpeg. | ||
+ | |||
===== Vérification des caméras connectées ===== | ===== Vérification des caméras connectées ===== | ||
Ligne 48: | Ligne 215: | ||
</ | </ | ||
- | Les bcmm2835 | + | Les bcm2835 |
=> On apprend qu' | => On apprend qu' | ||
+ | |||
+ | |||
===== ffmpeg pour la capture ===== | ===== ffmpeg pour la capture ===== |
ffmpeg_live_streaming.1745352203.txt.gz · Dernière modification : 2025/04/22 20:03 de luc