Comment puis-je diffuser de la vidéo H.264 à partir du module de caméra Raspberry Pi via un serveur Web?


50

Donc, j'ai la caméra Raspberry aujourd'hui et les photos fonctionnent correctement.

Capturer une image au format JPEG:

raspistill -o image.jpg

Capturez une vidéo de 5 secondes au format H.264 :

raspivid -o video.h264

Je ne souhaite installer aucune application supplémentaire car je souhaite exploiter le format HTML5 facilement disponible. Depuis que Chrome / Safari a des décodeurs intégrés pour H.264, je veux juste diriger mon navigateur vers l'URL et regarder le flux.

Comment puis-je atteindre cet objectif?


2
Je travaille aussi là-dessus. Je pense que vous devez ajouter le support MP4 à nginx ou quelque chose comme ça. Je vous ferai savoir si j'ai une percée.
Recantha

@recantha Avez-vous eu de nouvelles percées avec le streaming vidéo?
Piotr Kula

3
La meilleure solution que j'ai trouvée est basée sur le RaspiMJPEG de Silvan Melchoir. Jetez un coup d'œil à mon blog qui contient un lien vers le forum de la Fondation Raspberry Pi qui explique tout. ( recantha.co.uk/blog/?p=11176 )
recantha

2
Oui, ça a l'air génial de pouvoir diffuser sur différents appareils. Quels FPS et lag obtenez vous ?? J'ai réussi à faire fonctionner uv4l avec VLC et OSD. Une démo très courte et mauvaise. Fera un meilleur bientôt. A été faite tard dans la nuit après des heures d’essais et d’erreur. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin comment puis-je enregistrer via un script python lorsque RaspiMJPEG est en cours d'exécution? L'enregistrement vidéo au début, mais il enregistre au format .h264, comment exécuter un script python en appuyant sur start_recording?
Coderaemon

Réponses:


32

Streaming avec HLS

Méthode exclusive de streaming vidéo en direct d’Apple. Il s'appelle HTTP Live Streaming (HLS) et n'est pris en charge que par la technologie Apple. Google (Chromium / YouTube) utilise sa propre implémentation appelée dash mpeg et tout le monde est confus ou utilise H.264 encapsulé dans MP4 .

AVANTAGES

  • Peut diffuser du contenu HD 1080p sur un réseau local vers n'importe quel appareil prenant en charge les .m3u8listes de lecture
  • Utilise la sémantique HTML5 (mais ce n'est pas un format normalisé)
  • Certains logiciels premium de tiers tels que jwplayer 6 peuvent être utilisés

LES INCONVÉNIENTS

  • A un délai d'au moins 5 secondes (dans cette application, mais en utilisant la mise en miroir d'iPhone vers AppleTv, ils atteignent en quelque sorte 50 ms - 500 ms). Donc, ce n'est pas bon pour les applications télécommandées où des réactions instantanées sont nécessaires, à savoir des robots ou des hélicoptères.
  • Vous devez payer pour un logiciel tiers si vous souhaitez une prise en charge plus étendue du navigateur, susceptible de clignoter.

m3u8

  • .m3u8est simplement une version UTF-8 du format M3U. (Les fichiers .m3u peuvent avoir différents codages.) Certaines personnes affirment que le fait de renommer un fichier .m3u8 en .m3u fonctionnera comme prévu sur tous les navigateurs HTML5. J'ai essayé cela et cela n'a pas fonctionné pour moi.

Le principe sous-jacent à cette diffusion en continu est que de courts segments de fichiers, d’une durée minimale de 5 secondes (dans cet exemple - de nouvelles façons possibles de l’accélérer) sont enregistrés et sauvegardés dans un fichier approprié. Le fichier de liste de lecture est mis à jour avec le nouveau nom de fichier et le client interroge toujours cette liste de lecture et télécharge le fichier le plus récent. Certains mécanismes sont nécessaires pour fusionner la vidéo de manière transparente sur le client. C’est la raison pour laquelle d’autres développeurs ne souhaitent pas l’implémenter car cela nécessite beaucoup d’efforts et n’est pas conforme aux normes HTML5 (même s’il n’existe pas de norme HTML5 appropriée pour les flux en direct? Ehh, soupir ).

L'installation

Vous devez compiler ffmpeg- ne pas utiliser apt-get installpour FFmpeg

Cela peut prendre jusqu'à 5 heures. Il doit s'agir de la version 1.1 ou supérieure, qui prend en charge la diffusion en continu par segment. Vous pouvez utiliser ceci pour le cloner et le compiler.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • Installez nginx (engine-x) - nginx a été spécialement conçu pour les appareils embarqués. Il s’agit du serveur Web le plus léger et le plus rapide compatible PHP actuellement disponible. (Oui, c'est mieux qu'Apache encombrant )
  • Créez un répertoire, par exemple, habitez dans votre dossier www, /usr/share/nginx/www/

Créez un fichier de script Bash appelé quelque chose comme video.sh, appliquez- chmod +xle et collez-le dans. Modifiez le dossier de base en l'emplacement de votre serveur HTTP . J'ai utilisé nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

Créer un fichier HTML qui chargera la playlist

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

Soutien

  • iPhone, ouvre la page, mais passe à QuickTime . La qualité est vraiment incroyable!
  • Windows Safari, les flux très bien.
  • Macintosh ou Windows, QuickTime. Les cours d'eau bien.
  • Android 2.3.5 et ne fonctionnait pas, mais il était supposé être supporté depuis 2.1.x
  • Windows, Chrome - Rien
  • Windows, Internet Explorer 10 --- Rien (type de vidéo non pris en charge)
  • Windows, lecteur multimédia VLC - Rien

Référence: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

Code original: https://github.com/AndyA/psips/blob/master/examples/hls.sh


En ce qui concerne l'accélération de la compilation de ffmpeg Afin de contourner la faible capacité de calcul de RPI et les longs temps de compilation pour ffmpeg, j'ai essayé d'utiliser Qemu avec le Wheeze mais je suis tombé sur un obstacle lors de la connexion et j'ai dû essayer avec une image Arch. . Cela a fonctionné. Aussi essayé Sqeeze sur une image Ubuntu , via VirtualBo
luboP

2
Est-il possible de supprimer automatiquement les anciens segments? La carte SD se remplit après un certain temps. Je voudrais aussi qu'ils soient supprimés pour que je puisse l'exécuter sur un tmpfs sans ruiner la carte SD.
Dimme

2
@Dimmme Si vous ajoutez -segment_wrap 10comme argument à ffmpeg, il utilisera un maximum de 10 fichiers de segment.
Gregers

Quelqu'un at-il obtenu cela au travail? Les fichiers sont créés, mais les informations SPS / PPS semblent manquer. Par conséquent, la vidéo ne sera pas lue dans iOS Safari ni VLC. Stream.m3u8 n'incluait pas non plus les segments/fichiers de segment. Nous avons donc supprimé le dossier segments. Ai-je mal compris quelque chose?
Gregers

vous devez diriger le flux à travers le binaire du filtre PSIPS. La nouvelle version de Raspicam était censée le faire .. mais pour une raison quelconque, je ne pourrais pas le faire fonctionner sans PSIPS
Piotr Kula

23

UV4L MMAL

Merci au commentaire de @mpromonet pour la mise à jour du pilote Linux-Projects V4L2 qui implémente maintenant très efficacement MMAL - mais cela reste un travail en cours.

Suivez ces instructions pour installer le référentiel linux-project et installer le pilote UV4L avec des extras. Ensuite, installez le serveur et mjpeg. Si vous le souhaitez, vous pouvez également expérimenter avec les autres.

Une fois que vous avez tout installé, vous pouvez accéder au serveur HTTP sur le port 8080. Vous devez également vérifier le /etc/uv4l/conffichier et définir si vous voulez mjpeg ou H.264 car cela fait une différence, mais vous pouvez ajuster quelques paramètres via le Web intégré. serveur.

HTML 5

C’est ce que nous attendions tous (appelé WebRTC ) et grâce au nouveau pilote, il fonctionne très bien (sur un Raspberry Pi 2).

Premièrement, suivez ces étapes, http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 :

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

Puis, sur votre Raspberry Pi 2, installez ce WebRTC (pour un Raspberry Pi 1, lisez le site lié pour d’autres options)

sudo apt-get install uv4l-webrtc

Redémarrez tous les pilotes et allez à

http://raspberry:8080/

Vous disposez désormais d'un flux vidéo de haute qualité et à faible temps de latence directement dans un navigateur moderne tel que Chrome ou Firefox. (Peut-être Safari, mais je ne peux pas vérifier car ils ne font plus Winblows et Internet Explorer ... hein)

MJPEG

Par défaut, il utilise mjpegà 1080p, et c'est très lent. Je l'ai peaufiné en 800x600 et en utilisant quelque chose comme iSpy pour traiter la vidéo. Pour des raisons de sécurité, je reçois environ 10 images par seconde sur une vidéo nette. Il est bien meilleur que les 3 images par seconde à 640x480 avant ce pilote. Cela fonctionne sur iPhone avec Safari, Android Chrome et presque tout le reste.

http://raspberrypi:8080/stream/video.mjpeg

Cela signifie également que motiondevrait (je dois toujours tester et comparer) fonctionner beaucoup mieux maintenant. Assurez-vous de définir la configuration pour utiliser v4l2_palette 8ouv4l2_palette 2

H.264

Ce problème a maintenant été corrigé pour le "streaming" et nous n’avons pas besoin de faire beaucoup pour regarder des vidéos H.264 via le lecteur multimédia VLC . Le flux est toujours RAW H.264, vous devez donc le démultiplier ou le transcoder / encapsuler si vous avez besoin de l’utiliser ailleurs. Vous devriez modifier le bitrate=xxxxxxdans le fichier de configuration si vous diffusez en streaming via Wi-Fi.

Dans VLC Media Player, vous devez lui indiquer que vous souhaitez utiliser le démultiplexeur H.264. Donc, si vous utilisez l'interface graphique, assurez-vous d'ajouter l'argument :demux=264. De la ligne de commande, vlc http.../video.h264 --demux h264. Sinon, vous ne verrez qu'un écran vide, même si le voyant de l'appareil photo est allumé.

http://raspberrypi:8080/stream/video.h264

Voila! Streaming HD avec un décalage d'environ 500 ms (avec ajustement, jusqu'à 200 ms). C'est certainement beaucoup plus facile que d'utiliser les anciennes méthodes. La qualité et le FPS sont excellents, mais vous ne pouvez pas intégrer cela en HTML5 sans convertir les fichiers en MP4 ou WebM . J'espère que cela sera mis en œuvre car cela en fera vraiment un excellent serveur autonome.

RTSP / RTMP / RTP

Non pris en charge / mis en œuvre

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

Non pris en charge / mis en œuvre


Il n'y a pas encore de video4linuxpilote disponible. Cela signifie que nous ne pouvons pas utiliser ffserver pour diffuser des données en utilisant /dev/video0ou simlar comme une webcam USB.

C'est pourquoi il est si difficile de trouver le bon streaming en direct pour les navigateurs HTML5.


Maintenant, il y a le video4linuxpilote officiel V4L2, le pilote bcm2835-v4l2 et le pilote d'espace utilisateur V4L2 [ linux-projects.org/modules/sections/…
mpromonet

Est-ce un vrai pilote v4l ou est-ce juste cette enveloppe autour de raspivid qui donne des performances terribles?
Piotr Kula

1
Le pilote officiel utilise l'interface MMAL, voir le code source [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . La performance semble correcte.
mpromonet

Je joue avec cela depuis 3 jours maintenant. Le codage mjpeg est nettement plus stable et peut afficher de manière fiable 800x600 @ 10fps sur iPhone, Android ou iSpy. h264 est excellent à 30pps 1080p et nous pouvons le voir en vlc en utilisant le --demux h264drapeau. Nous avons toujours besoin de transcoder cela pour une utilisation sur mobile ou pour une intégration en tant que mp4 / webm sur des pages Web. Mais c'est vraiment un grand progrès en termes d'efficacité et de qualité. Ne confondez pas avec "l'autre" chose de pilote non linux de projet UV4L qui est une ordure.
Piotr Kula

Notez que l'ajout de: demux = 264 dans la méthode H264 concerne le serveur vlc, pas le client vlc. Donc, la ligne de commande pour lancer le streaming sur le framboise pour obtenir la compatibilité avec vlc dans les smartphones est la suivante:/usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Jaime M.

10

Streaming avec MJPEG

U4VL

Une interface de noyau avec un serveur HTTP (S) intégré.

http://www.linux-projects.org/uv4l/tutorials/streaming-server/

Interface Web Raspberry Pi Cam

Un beau projet de silvanmelchior qui déploie un serveur Web, type dvr, serveur de streaming multi-cibles. Besoin de plus d'informations

https://github.com/silvanmelchior/RPi_Cam_Web_Interface

Méthode héritée

Le streaming avec mjpg est pris en charge par presque tous les navigateurs, y compris Internet Explorer 6. De nombreux appareils photo utilisés avant le H.264 utilisaient du matériel mjpg, qui vidait essentiellement les fichiers JPEG dans un dossier aussi rapidement que possible, tandis que mjpg lisait le fichier dans un tampon et le supprimait. leur. Certains appareils peuvent atteindre jusqu'à 25 images par seconde et même en cas de mauvaise connexion, vous obtenez au moins 1 image par seconde.

La prise en charge de mjpg dans les caméras HD a été abandonnée car le fichier JPEG est devenu trop volumineux pour pouvoir être diffusé en continu sur Internet et le protocole H.264 est un protocole beaucoup plus rapide et de meilleure qualité.

Comme nous n'avons aucun moyen de diffuser H.264 en utilisant le module de caméra de manière native, cela semble être une solution de remplacement viable ...

C'est quasiment instantané, mais ne vous attendez pas à plus de 1,5 fps. Cela doit raspistillêtre extrêmement SLOOOW! L'utilisation de la fonction time-lapse réglée sur 100 ms, ce qui devrait nous donner 10 fps, ne fonctionne pas, car elle raspistills'étouffe et pose de sérieux problèmes de performances.

  1. Changez /tmppour utiliser la RAM pour /etc/default/tmpfschanger de vitesse RAMTMP=yes(Ceci est un effort pour augmenter le nombre de fps, mais raspistill ne peut tout simplement pas rester en place.)
  2. Redémarrer
  3. apt-get install git
  4. apt-get installez libjpeg8-dev
  5. apt-get install libv4l-dev
  6. apt-get install imagemagick
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. FACULTATIF Si vous avez des erreurs
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. À l'intérieur du makefile, commentez tous les plugins à l'exception de input_file et output_http et faites make à nouveau. J'ai eu beaucoup de problèmes ici.
  14. Copiez le binaire, mjpg_streameret ses plug - ins input_*.soet output_*.soà /usr/local/bin. Sinon, exécutez-le directement à partir du répertoire src.
  15. Fin facultative
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www" (exécutez ceci où le binaire et les plugins sont)
  19. Aller à http://<IP-address>:8080
  20. Voici quelques options, profitez du streaming "en direct" à l'ancienne ... supporté par la plupart des navigateurs - modernes, anciens et expérimentaux.

J'ai eu du mal à le compiler pendant environ 5 heures ... soupir , mais je pense que je vais l'utiliser car je peux accéder au flux depuis n'importe quel téléphone ou navigateur. Je dois juste attendre d'avoir de meilleurs pilotes ... Un an ou deux. :(

Quelle que soit la qualité que j'essaie, je n'obtiens pas plus vite ou plus lentement que 1 fps en utilisant stream. J'ai utilisé les formats 720p et 1080p et seule la qualité d'image s'améliore, mais la vitesse par seconde n'est pas différente en réseau local. Je suppose que des réglages plus petits aideront avec les transmissions WAN / 3G ou autres transmissions radio.

Raspistill écrit l'image dans un seul fichier. Cela pourrait être un goulot d'étranglement. Il écrit le fichier, mjpg strreamer le lit et le supprime, ce qui provoque un blocage des E / S. Par conséquent, raspistill ne peut pas écrire dans le fichier.

La seule chose à laquelle je peux penser est d’utiliser Raspivid dans FFmpeg qui créera des fichiers JPEG pour nous. Je dois essayer cela et c’est peut-être beaucoup plus rapide que d’utiliser Raspistill. J'ai réussi à obtenir 25 images par seconde avec une qualité choquante, et cela a été retardé d'environ 10 secondes ... Des réglages précis m'ont permis d'obtenir environ 3 images par seconde, mais 100% du processeur. Aucun matériel n'est utilisé pour traiter le flux vidéo ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

J'étais également en train de lire et j'ai découvert que nous pouvions utiliser %dle nom du fichier de sortie de raspistill. Je me demande si ça va booster les fps. De plus, l'encodage JPG est accéléré de manière matérielle dans Raspistill, je suis donc vraiment en peine de comprendre pourquoi c'est si lent ...

J'ai reçu un nombre impressionnant de 2 images par seconde %ddans le nom du fichier. Pour une raison quelconque, l'écriture du fichier JPEG est horriblement lente à cause de raspistill. Soupir.


merci de partager ces connaissances
user566245

10

À partir de 2017 (ou peut-être plus tôt) raspividn'est plus la méthode préférée, les développeurs Pi recommandant aux utilisateurs d'utiliser V4L2 à la place.

Donc, cette méthode vous permet de diffuser H264 via RTP en utilisant V4L2 au lieu de raspivid. J'ai remarqué que cette méthode entraîne moins de pertes et permet un débit plus élevé:

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

Ce script permet de multidiffuser la vidéo et de la visionner sur une autre machine du réseau local avec une commande comme celle-ci:

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync extLa vidéo est lue aussi rapidement que possible pour qu'elle soit diffusée en temps réel, au lieu de la lire à une vitesse de traitement fixe et en retard si le Pi capture des images plus rapidement que cela. Il y a encore un certain retard avec cette méthode, mais pas pire que les autres raspividméthodes.

(Astuce: si vous êtes connecté à un routeur ou à un commutateur prenant en charge IGMP, assurez-vous que 224.0.0.0/4votre ordinateur n’est pas pare-feu, sinon, lorsque le routeur demande à votre PC s’il souhaite un trafic de multidiffusion, celui-ci ne répondra jamais et vous ne verrez jamais toute vidéo.)

Enregistrement sur disque

Comme j'ai mentionné l'enregistrement dans les commentaires ci-dessous, je vais développer ici. Vous pouvez utiliser une commande comme celle-ci pour enregistrer le flux réseau sur le disque:

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

Recherchez man strftimela signification des %symboles dans le nom du fichier. Ceux de cet exemple utilisent le numéro du jour (0 = dimanche, 1 = lundi, etc.) suivi de a Tpuis de l'heure. Il commence un nouveau fichier toutes les 15 minutes.

Soyons clairs: cette commande d’enregistrement est destinée à être exécutée sur un PC distant (pas sur le Pi lui-même) bien qu’elle fonctionne probablement aussi sur le Pi (non testé).

Comme vous obtenez un nouveau fichier toutes les 15 minutes avec le jour et l'heure dans le nom du fichier, cela signifie qu'après une semaine, les noms de fichiers déjà générés sont générés, ce qui entraîne le remplacement des fichiers les plus anciens. En d'autres termes, vous vous retrouverez avec une boucle continue des images de la semaine précédente. C'est idéal pour une caméra de sécurité où vous aurez rarement besoin de revenir plus d'une semaine.

Notez également que cela produit environ 500 Go de fichiers. Vous pouvez donc ajuster le débit binaire, la résolution ou écraser les fichiers plus tôt (par exemple toutes les 24 heures) si vous ne voulez pas qu'ils occupent autant d'espace.


Cool - Merci de partager cela. Pouvez-vous expliquer pourquoi l'utilisation de la multidiffusion est nécessaire ici? D'après ce que j'ai appris, la multidiffusion est rarement utilisée - alors je me demandais ce qu'elle apportait à la table? Toujours - Le script a fière allure et je suis sûr qu'il aidera beaucoup de monde. Merci +1
Piotr Kula

1
La multidiffusion est facultative - vous pouvez simplement remplacer une adresse IP normale si vous le souhaitez - mais vous devrez modifier la commande à utiliser ffserverou utiliser un autre système de serveur si vous souhaitez que plusieurs ordinateurs affichent le flux. Ensuite, après environ 2 ou 3 clients (en fonction du débit vidéo), l'adaptateur Ethernet USB du Pi manquera de bande passante. Avec la multidiffusion, il n’est pas nécessaire d’exécuter un serveur (les machines clientes choisissent simplement d’écouter ou d’ignorer le trafic), de sorte que vous pouvez avoir des milliers de machines affichant la vidéo sans aucun impact sur le Pi, qui n'envoie jamais qu'un seul flux vidéo. .
Malvineous

Merci de m'avoir expliqué - Mais la multidiffusion ne fonctionne que sur les réseaux internes? Si un fournisseur de services Internet reçoit un paquet de multidiffusion, il se contente généralement de le supprimer. Donc, ce n'est pas comme si vous pouviez simplement diffuser sur Internet. Je suppose que si vous avez un grand réseau interne, mulit pour lancer un flux massif peut aussi avoir un impact sur votre réseau? Mais oui ... juste pour que je voie un flux, je voudrais juste utiliser UDP sur une adresse IP sélectionnée .. mais j'aime quand même l'option multicast: D Je vais essayer de le faire ce week-end juste parce que je ne l'avais jamais fait auparavant. :) Merci
Piotr Kula

1
Oui, la multidiffusion concerne principalement les réseaux internes. Il est supposé fonctionner mieux avec IPv6, mais je pense qu’il faudra tout de même une coopération avec le FAI. Je l'utilise parce que cela signifie que je n'ai pas besoin de faire fonctionner un serveur sur le Pi, et que je peux visualiser les flux de deux machines différentes et l'enregistrer sur le disque sans modifier la configuration du Pi ni surcharger la bande passante du réseau du Pi. Si votre réseau interne est vaste, vous utiliserez probablement des commutateurs compatibles IGMP, conçus pour envoyer uniquement du trafic multidiffusion lorsque cela est nécessaire pour que l’impact ne soit pas différent de la normale.
Malvineous

1
Merci de votre explication. Je peux maintenant constater de nombreux avantages à l’utilisation de la multidiffusion avec des mises en garde mineures qui n’impacteront même pas réellement les utilisateurs à domicile. Je vais certainement essayer cela. Ce sont des choses simples et évidentes qui doivent parfois être signalées pour donner un sens. Et en regardant votre mise à jour, le bit d’enregistrement est vraiment, vraiment cool!
Piotr Kula

4

J'ai réussi à diffuser de mon Raspberry Pi sur un serveur Web avec le module compilé-in nginx-rtmp .

Pour éviter les tracas avec ffmpeg, je recommande une distribution évolutive telle que Arch Linux Arm .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

Quelques notes:

  • Le flux vidéo H.264 codé en matériel nécessite environ 300 Ko / s de bande passante , ce qui, si je calculais correctement, prendrait au moins 750 Go par mois si vous souhaitez diffuser sur votre nginx-rtmp httpd ou un service RTMP comme ustream .
  • Audio: si vous souhaitez que l'audio accompagne votre flux H.264, vous en avez besoin en AAC . Fondamentalement, le Raspberry Pi est trop lent pour coder un microphone USB en AAC à la volée .

Donc, sur cette base, je pense que la diffusion en direct à partir d'un Raspberry Pi pourrait convenir à une diffusion temporaire, mais pas à une webcam en permanence, car elle consomme trop de bande passante. Vous n'obtiendrez pas de son et si vous en avez, la synchronisation sera une mission.

Vous pouvez enregistrer l'audio plus efficacement séparément en même temps que l'enregistrement vidéo. Puis, plus tard, multiplexez éventuellement le flux audio, convertissez-le en WebM et placez-le sur votre httpd sous forme de fichier statique avec une balise vidéo HTML. Le flux de travail est assez délicat, bien que ce soit le meilleur que je puisse penser pour une diffusion efficace qui fonctionnera sans peine sur tous les navigateurs.


1
Vous pouvez cependant contrôler la bande passante et la résolution. Si son streaming LAN local pour la vidéosurveillance est utilisé, alors ce n’est même pas un problème. La diffusion sur Internet pourrait devoir être à la demande et / ou d'une résolution beaucoup plus basse. Mais c'est une autre façon de le faire. Merci +1
Piotr Kula

et comment cela suppose-t-il de fonctionner? ça ne me convient pas ... FFMPEG dit "RTMP_Connect0, échec de connexion du socket. 111 (Connexion refusée)"
Flash Thunder


2

La réponse de Piotr Kula semble être sur la bonne voie mais est dépassée pour Raspberry Stretch.

Il existe des instructions mises à jour pour uv4l sur Raspberry Stretch à l'adresse

https://www.linux-projects.org/uv4l/installation/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

Vous pouvez modifier les options uv4l via /etc/uv4l/uv4l-raspicam.conf, puis redémarrer le service avec

sudo service uv4l_raspicam restart

Dans mon cas, les choses ne se sont pas déroulées telles quelles (si vous avez oublié d'installer le serveur uv4l ...). Les commentaires suivants pourraient vous aider à résoudre des problèmes similaires.

J'ai vérifié que le serveur tourne avec:

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

et s'il a écouté avec

sudo netstat -tulpn 

mais il n'y avait aucune entrée pour uv4l dans la liste. Je m'attendais à un pour le port 8080

J'ai donc essayé la commande de Comment configurer UV4L?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

Mais le serveur n'a toujours pas démarré automatiquement ...

man uv4l

puis m'a montré l'option

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

alors j'ai essayé:

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

mais toujours pas de serveur fonctionnant sur le port 8080 ou ailleurs. Il semble donc que j'ai oublié l'option "--foreground" que la page de manuel déclare nécessaire:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

Maintenant, c'est un indice clair! Il semble qu'il n'y ait pas encore de serveur - installez-le donc:

sudo apt-get install uv4l-server

et essayez à nouveau:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

Le serveur est maintenant disponible à l' adresse http: // pi: 8080 (remplacez pi par l' adresse IP ou le nom d'hôte de votre serveur)

Après un redémarrage, cela a fonctionné sans entrer une autre commande.


1

UV4L prend désormais en charge la diffusion audio et vidéo en direct vers Jitsi Meet Rooms sur le Web. Aucune configuration spéciale n'est requise. C'est aussi simple que de remplir votre nom, votre pièce et de cliquer sur Démarrer .


Quel navigateur utilisez-vous? Jitsi ne supporte que Chrome, Chromium, Opera et Firefox Nightsly, seul Chromium étant disponible sur le Pi. Mais le chrome me donne une webkitRTCPeerConnection is not definederreur. J'utilise normalement IceWeasel pour WebRTC, mais cela n'est pas pris en charge pour Jitsi.
Modulitos

1
Sur le PI, il n’existe aucun navigateur prenant en charge WebRTC, à l’exception d’un support presque défaillant dans IceWeasel. La façon dont je l'utilise est la suivante: Pi-> Serveur Jitsi sur le Cloud -> mon PC ailleurs
prinxis

1
UV4L prend en charge la diffusion en direct H264 codée en mode matériel sans latence.
Prinxis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.