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 : de luc
