HTML5 Live stream

Le problème exposé dans ce sujet a été résolu.

Bonsoir,

Après quelques heures de recherches, je viens demander votre aide svp :D

J’ai une caméra (imaginons une raspberry par exemple) dont je cherche à afficher le stream vidéo sur une page HTML accessible en dehors du réseau local.

Mes contraintes :

  • La caméra utilise une carte SD. Je ne souhaite pas écrire dessus continuellement pour la préserver (j’ai déjà flingué plusieurs cartes comme cela…)
  • La caméra a des ressources limitées. J’oublie donc les solutions complexes et gourmandes demandant des conteneurs Docker ultra lourds etc.
  • Le stream doit pouvoir être sécurisé
  • Une faible latence (inferieure à 5 sec)
  • Utiliser uniquement ffmpeg si possible

Je dois admettre que je suis un peu perdu…

Je suis allé voir du côté des technos HLS/DASH mais ce principe de playlists oblige l’écriture continue de fichiers.

Auriez-vous d’autres solutions à me suggérer ?

Merci d’avance !

En effet, HLS et DASH semblent adaptés si tu trouves un bon player Web qui le supporte (ce qui ne devrait pas être un souci). Avec ffmpeg, tu le sais peut-être déjà, tu peux générer tes segments et ton manifeste pour HLS ou DASH, lesquels n’ont plus qu’à être servis avec un simple serveur HTTP statique comme NGINX par exemple.

Pour ton problème de carte SD, tu peux éviter l’écriture physique dessus en utilisant la RAM. Comme ffmpeg travaille en sortant des fichiers, l’astuce est d’utiliser un volume temporaire monté en RAM (en tmpfs par exemple). Parfois les distributions l’appliquent automatiquement pour /tmp (mais pas toujours) et /dev/shm. Tu peux donc indiquer à ffmpeg de générer les segments et le manifeste dans un tel volume (dans un subdirectory de préférence), puis configurer ton serveur HTTP pour servir à partir de là. Il n’y aura alors pas la moindre écriture sur la carte SD.

Évidemment, on ne veut pas accumuler les fichiers là-dedans sinon ta RAM saturera. Les segments peuvent être automatiquement supprimés ou remplacés selon les options que tu passes à ffmpeg afin de garder une occupation RAM constante.

Je pars du principe que tu ne veux pas spécialement enregistrer le live, sinon il faudra écrire quelque part, carte SD ou disque externe.

Le stream peut être sécurisé s’il est servi sur HTTPS, c’est à voir avec la configuration de ton serveur HTTP.

Exemple rapide (pas testé et pas optimisé) avec ffmpeg pour du HLS :

ffmpeg \
    -f video4linux2 \
    -i $device \  # Nom de la caméra en USB sur le RPi
    -f hls \
    -c:v h264 \
    -s 640x480 \
    -hls_time 5 \  # approximatif à moins de forcer une keyframe sur un multiple de 5
    -strftime 1 \
    -hls_segment_filename "/tmp/live/seg-%s.ts" \
    "/tmp/live/out.m3u8"

Côté NGINX, quelque chose comme ça sur le même RPi (sans HTTPS) :

server {
  listen       80;
  listen       [::]:80;
  server_name  monlive.example.com;
  root         /tmp/live;
}

Et sans oublier de servir la page HTML qui contient le code nécessaire pour le player HLS ou DASH bien-sûr ! (pas forcément sur le même serveur)

Pour que ce soit accessible en dehors du réseau local, il faudra voir avec les paramètres réseaux de ton routeur. Difficile d’en dire plus sans plus d’infos, ça pourrait potentiellement mériter son propre topic selon les cas. Il y aura aussi la partie sécurité à voir (pour mettre en place HTTPS et éviter aux clients d’accéder à des fichiers indûment).

+4 -0

Merci pour vos réponses

L’idée de mettre en RAM les segments HLS me semble une très bonne idée :) J’ai réalisé quelques essais et je peux y stocker environ 2min de vidéo en full HD, ce qui est largement suffisant !

Ce qui est dommage avec le HLS c’est qu’il y a une faible latence que le RTSP n’a pas. Mais à part le WebRTC (que ffmpeg ne supporte pas) ou le RTMP qui nécessite un serveur, je n’ai rien trouvé d’autre…

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte