J'ai un RaspberryPi et une webcam Logitech C920. Je veux utiliser ces appareils pour fonctionner comme surveillance/babycam, c'est-à-dire: Stream audio + vidéo sur HTTP (ou tout autre protocole) sans transcodage vidéo intensif en processeur
La webcam C920 est capable de diffuser H264 en natif, donc théoriquement, je n'aurai pas besoin de demander à RaspberyPi + VLC de transcoder le flux vidéo.
Le flux de microphone C920 intégré ne semble pas être inclus dans le flux de webcam. La came et le microphone sont deux appareils distincts.
Le C920 possède également un indicateur à LED intégré. Je veux contrôler cela pour éviter que la LED ne s'allume pendant l'enregistrement.
Comment puis-je y parvenir?
Cette solution est testée et fonctionne avec les versions indiquées ci-dessous. En utilisant cette méthode, le RaspberryPi3 est toujours autour de 5% CPU.
edit 2018-11-18: On peut également voir le prototype de la solution tout-en-un sur page d'accueil du projet RaspiVWS (pour les curieux, voir projet GitHub )
0. Contrôles préliminaires
1. Configuration vidéo de la webcam
2. Identification du microphone
3. Diffuser en utilisant VLC
4. Faire de RaspberryPi3 + un point d'accès Wifi (Si vous n'avez pas de réseau existant pour connecter votre Pi)
5. Script au démarrage ou en tant que service
6. [EDIT] Commandes supplémentaires: enregistrement en boucle infinie et vidéo partagée
7. [EDIT] Exécution du programme à un instant donné
8. [MODIFIER] DÉPANNAGE
La réponse fonctionne avec Raspbian 9.4 Stretch. Vérifiez votre version avec la commande suivante:
lsb_release -a
Tu devrais voir:
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 9.4 (stretch)
Release: 9.4
Codename: stretch
Nous pouvons compter sur les outils suivants:
v4l2-ctl
ce qui nous permettra de contrôler et de configurer la webcam.Vous pouvez les installer avec les commandes suivantes:
Sudo apt-get install vlc
Sudo apt-get install v4l-utils
Une fois que tout est installé, vous pouvez configurer votre webcam C920.
v4l2-ctl --all
répertorie tous les périphériques disponibles et leur configuration
pi@raspberrypi:~ $ v4l2-ctl --all
Driver Info (not using libv4l2):
Driver name : uvcvideo
Card type : HD Pro Webcam C920
Bus info : usb-3f980000.usb-1.5
Driver version: 4.14.30
Capabilities : 0x84200001
Video Capture
Streaming
Extended Pix Format
Device Capabilities
Device Caps : 0x04200001
Video Capture
Streaming
Extended Pix Format
Priority: 2
Video input : 0 (Camera 1: ok)
Format Video Capture:
Width/Height : 1920/1080
Pixel Format : 'H264'
Field : None
Bytes per Line : 3840
Size Image : 4147200
Colorspace : sRGB
Transfer Function : Default
YCbCr/HSV Encoding: Default
Quantization : Default
Flags :
Crop Capability Video Capture:
Bounds : Left 0, Top 0, Width 1920, Height 1080
Default : Left 0, Top 0, Width 1920, Height 1080
Pixel Aspect: 1/1
Selection: crop_default, Left 0, Top 0, Width 1920, Height 1080
Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1080
Streaming Parameters Video Capture:
Capabilities : timeperframe
Frames per second: 30.000 (30/1)
Read buffers : 0
brightness (int) : min=0 max=255 step=1 default=-8193 value=128
contrast (int) : min=0 max=255 step=1 default=57343 value=128
saturation (int) : min=0 max=255 step=1 default=57343 value=128
white_balance_temperature_auto (bool) : default=1 value=1
gain (int) : min=0 max=255 step=1 default=57343 value=255
power_line_frequency (menu) : min=0 max=2 default=2 value=2
white_balance_temperature (int) : min=2000 max=6500 step=1 default=57343 value=4822 flags=inactive
sharpness (int) : min=0 max=255 step=1 default=57343 value=128
backlight_compensation (int) : min=0 max=1 step=1 default=57343 value=0
exposure_auto (menu) : min=0 max=3 default=0 value=3
exposure_absolute (int) : min=3 max=2047 step=1 default=250 value=333 flags=inactive
exposure_auto_priority (bool) : default=0 value=1
pan_absolute (int) : min=-36000 max=36000 step=3600 default=0 value=0
tilt_absolute (int) : min=-36000 max=36000 step=3600 default=0 value=0
focus_absolute (int) : min=0 max=250 step=5 default=8189 value=0 flags=inactive
focus_auto (bool) : default=1 value=1
zoom_absolute (int) : min=100 max=500 step=1 default=57343 value=100
led1_mode (menu) : min=0 max=3 default=3 value=3
led1_frequency (int) : min=0 max=255 step=1 default=0 value=0
Les 2 dernières lignes nous donnent des indices pour contrôler l'indicateur LED intégré, par exemple, pour désactiver l'indicateur LED. Le -d0
le paramètre indique sur quel appareil la modification doit être appliquée (si vous avez plusieurs cames ou si le nom de votre appareil a changé)
v4l2-ctl -d0 --set-ctrl=led1_mode=0
v4l2-ctl -d0 --set-ctrl=led1_frequency=30
La commande arecord -l
nous donnera la liste des appareils ALSA. (ALSA est le gestionnaire audio de RaspberryPi)
pi@raspberrypi:~ $ arecord -l
**** Liste des Périphériques Matériels CAPTURE ****
carte 1: C920 [HD Pro Webcam C920], périphérique 0: USB Audio [USB Audio]
Sous-périphériques: 1/1
Sous-périphérique #0: subdevice #0
Cela signifie que le microphone intégré est situé sur hardware 1, periph 0
. Vous pouvez vérifier cela en ligne de commande avec alsamixer -c 1 -V capture
VLC peut être lancé en utilisant la ligne de commande. Étant donné que la vidéo et l'audio ne sont pas déjà mélangés dans un seul accès au flux, nous devons demander à VLC de le faire. C'est le rôle de la fonction transcoding
de VLC.
Nous voulons également diffuser sur HTTP, VLC peut également y parvenir.
cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
Explication
v4l2:///dev/video0:chroma=h264
donne des données d'entrée VLC: il saisit le flux vidéo de/dev/video0 et qu'il s'agit d'un encodage h264 (si votre webcam est le 0ème périphérique vidéo, il peut également s'agir d'un autre nombre, reportez-vous à v4l2-ctl --all
commande):input-slave=alsa://hw:1,0
indique à VLC de prendre un autre flux d'entrée avec la vidéo. Il s'agit du flux audio identifié à partir de arecord
ci-dessus--sout
indique à VLC comment gérer le flux de sortie#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}
indique à VLC de convertir l'audio en codec mpga
, 128 kbits/s, 2 canaux, échantillonnage 44100 Hz, en utilisant les 4 cœurs RaspberryPi3 +. audiosync est facultatif. Il m'a fallu un certain temps pour le réaliser: le flux vidéo de la webcam h264 est conservé tel quel (pas de transcodage vidéo).:standard{access=http,mux=ts,mime=video/ts,dst=:8099}
indique à VLC de fournir un flux sur HTTP sur le port 8099 avec le format de multiplexage TS.Sur tout autre appareil, vous pouvez utiliser VLC pour accéder à votre flux RaspberryPi3 + VLC: vlc http://<raspberrypi-ip>:8099
Cela fonctionne avec n'importe quel client VLC:
NB: Avoir la vidéo déjà en H264 1920x1080 30fps en sortie de la webcam permet d'économiser beaucoup de CPU RaspberryPi3 +.
Vous pouvez également enregistrer dans différents conteneurs, voire conteneurs + stream, en voici quelques exemples:
enregistrer en MKV cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mkv,dst='/home/pi/Webcam_Record/MyVid.mkv'}'
enregistrer en MP4 cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'}'
enregistrement + flux cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/MyVid.mp4'},dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}}'
Vous pouvez également utiliser une chaîne formatée pour les noms de fichiers. Commande de préfixe comme celle-ci:
cvlc --sout-file-format v4l2:///dev/video0:<...> dst='/home/pi/Webcam_Record/%F_%T_MyVid.mp4'}
Il produira un fichier nommé YYYY-MM-DD_HH:MM:SS_MyVid.mp4
(:
sont autorisés dans les noms de fichiers Unix, mais pas dans les noms de fichiers Windows)
Si vous n'avez pas de réseau existant pour connecter votre Pi à: Vous pouvez suivre les instructions du site officiel de RaspberryPi3 +: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
Sinon, si vous avez déjà un réseau, vous pouvez vous connecter à votre pi en utilisant son IP. Voir partie 3
Sur tout autre appareil, vous pouvez utiliser VLC pour accéder à votre flux RaspberryPi3 + VLC:
vlc http://<raspberrypi-ip>:8099
Vous pouvez placer de nombreuses commandes dans un fichier bash my_bash_file.sh
. Par exemple :
#!/bin/bash
# auto stream launch + led off
#cvlc -vvv for verbose debug
# change this value to adapt to your webcam device number
deviceNb=0
# force video format + led off
v4l2-ctl -d${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0
# if delay needed
# cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 :live-caching=2500 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
# no delay
cvlc v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
Vous pouvez ensuite faire le rc.local
script utilise votre script personnalisé pour être exécuté au démarrage. Vous pouvez suivre les instructions du site officiel de RaspberryPi3 +: https://www.raspberrypi.org/documentation/linux/usage/rc-local.md
Nous allons créer un service "webcam-stream", en supposant que toutes les commandes bash nécessaires se trouvent /home/pi/Webcam_Record/vlc_webcam_stream_service.sh
cd /lib/systemd/system/
Sudo nano webcam-stream.service
Et écrivez-y:
[Unit]
Description=Custom Webcam Streaming Service
After=multi-user.target
[Service]
Type=simple
ExecStart=/home/pi/Webcam_Record/vlc_webcam_stream_service.sh
Restart=on-abort
[Install]
WantedBy=multi-user.target
Rendez le fichier de service et le script exécutables:
Sudo chmod 644 /lib/systemd/system/webcam-stream.service
chmod +x /home/pi/Webcam_Record/vlc_webcam_stream.sh
Autoriser VLC à s'exécuter en tant que root:
Sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc
Rechargez les démons et activez notre service:
Sudo systemctl daemon-reload
Sudo systemctl enable webcam-stream.service
Vérifiez qu'il est reconnu et fonctionne:
Sudo service webcam-stream status
Sudo service webcam-stream start
Vous pouvez vérifier avec un autre ordinateur que la vidéo est correctement diffusée. Notez que la webcam ne sera pas disponible pendant l'exécution du service.
Une fois que vous avez terminé, vous pouvez vous connecter au point d'accès wifi RaspberryPi3 + et accéder à votre flux vidéo.
Les scripts bash suivants permettent un enregistrement infini de longues vidéos de 15 s avec des noms de fichiers horodatés et une diffusion en continu
#!/bin/bash
# auto stream launch + led off
#cvlc -vvv for verbose debug
# adapt to video device name
deviceNb=1
# loop duration
duration=15
#infinite recording
#loopOption=
loopOption=--loop
# force video format + led off
v4l2-ctl -d ${deviceNb} --set-fmt-video=width=1920,height=1080,pixelformat=1 --set-ctrl=led1_mode=0
# if delay needed :live-caching=2500
cvlc --sout-file-format --run-time=${duration} ${loopOption} v4l2:///dev/video${deviceNb}:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1}:duplicate{dst=standard{access=file,mux=mp4,dst='/home/pi/Webcam_Record/%F_%T_Spy.mp4'}:dst=standard{access=http,mux=ts,mime=video/ts,dst=:8099}'
EDIT 04 août 2018
Pour lancer l'exécution aujourd'hui à 14h00, vous pouvez utiliser la commande suivante:
./my_vlc_webcam_script.sh | at 1400
Voir le manuel de commande at
pour plus de détails.
EDIT 07 juil 2018
J'ai récemment rencontré une erreur VLC après une mise à niveau dist:
VLC media player 2.2.6 Umbrella (revision 2.2.6-0-g1aae78981c)
[00acb230] Pulse audio output error: PulseAudio server connection failure: Connection refused
La solution que j'ai trouvée est de lancer VLC en mode GUI et de changer le périphérique audio par défaut en ALSA (au lieu d'Automatique). Je peux aussi me faire en ligne de commande. Voir la solution trouvée ici problèmes VLC avec PulseAudio
cvlc -A alsa,none --alsa-audio-device default