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?
webcam
streaming-video
camera
Piotr Kula
la source
la source
Réponses:
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
.m3u8
listes de lectureLES INCONVÉNIENTS
m3u8
.m3u8
est 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 utiliserapt-get install
pour FFmpegCela 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.
/usr/share/nginx/www/
Créez un fichier de script Bash appelé quelque chose comme
video.sh
, appliquez-chmod +x
le et collez-le dans. Modifiez le dossier de base en l'emplacement de votre serveur HTTP . J'ai utilisénginx
,/usr/share/nginx/www/
Créer un fichier HTML qui chargera la playlist
Soutien
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
la source
-segment_wrap 10
comme argument à ffmpeg, il utilisera un maximum de 10 fichiers de segment.segments/
fichiers de segment. Nous avons donc supprimé le dossier segments. Ai-je mal compris quelque chose?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/conf
fichier 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 :
Puis, sur votre Raspberry Pi 2, installez ce WebRTC (pour un Raspberry Pi 1, lisez le site lié pour d’autres options)
Redémarrez tous les pilotes et allez à
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
motion
devrait (je dois toujours tester et comparer) fonctionner beaucoup mieux maintenant. Assurez-vous de définir la configuration pour utiliserv4l2_palette 8
ouv4l2_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=xxxxxx
dans 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 œuvrehttp://www.linux-projects.org/uv4l/tutorials/rtsp-server/
HLS
Non pris en charge / mis en œuvre
Il n'y a pas encore devideo4linux
pilote disponible. Cela signifie que nous ne pouvons pas utiliser ffserver pour diffuser des données en utilisant/dev/video0
ou simlar comme une webcam USB.C'est pourquoi il est si difficile de trouver le bon streaming en direct pour les navigateurs HTML5.
Gstreamer
(pas HTML5)<OBJECT ...
:) (en différé)la source
video4linux
pilote officiel V4L2, le pilote bcm2835-v4l2 et le pilote d'espace utilisateur V4L2 [ linux-projects.org/modules/sections/…--demux h264
drapeau. 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./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
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 elleraspistill
s'étouffe et pose de sérieux problèmes de performances./tmp
pour utiliser la RAM pour/etc/default/tmpfs
changer de vitesseRAMTMP=yes
(Ceci est un effort pour augmenter le nombre de fps, mais raspistill ne peut tout simplement pas rester en place.)/usr/src
, mkdir mjpg-streamer, cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
et ses plug - insinput_*.so
etoutput_*.so
à/usr/local/bin
. Sinon, exécutez-le directement à partir du répertoire src.mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
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)http://<IP-address>:8080
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 ...
J'étais également en train de lire et j'ai découvert que nous pouvions utiliser
%d
le 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
%d
dans le nom du fichier. Pour une raison quelconque, l'écriture du fichier JPEG est horriblement lente à cause de raspistill. Soupir.la source
À partir de 2017 (ou peut-être plus tôt)
raspivid
n'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é: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:
-sync ext
La 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 autresraspivid
méthodes.(Astuce: si vous êtes connecté à un routeur ou à un commutateur prenant en charge IGMP, assurez-vous que
224.0.0.0/4
votre 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:
Recherchez
man strftime
la 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 aT
puis 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.
la source
ffserver
ou 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. .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 .Quelques notes:
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.
la source
UV4L prend désormais en charge la diffusion audio et vidéo en direct avec WebRTC et HTML5.
la source
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/
Vous pouvez modifier les options uv4l via /etc/uv4l/uv4l-raspicam.conf, puis redémarrer le service avec
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:
et s'il a écouté avec
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?
Mais le serveur n'a toujours pas démarré automatiquement ...
puis m'a montré l'option
alors j'ai essayé:
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:
Maintenant, c'est un indice clair! Il semble qu'il n'y ait pas encore de serveur - installez-le donc:
et essayez à nouveau:
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.
la source
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 .
la source
webkitRTCPeerConnection is not defined
erreur. J'utilise normalement IceWeasel pour WebRTC, mais cela n'est pas pris en charge pour Jitsi.