web-dev-qa-db-fra.com

Raspberry Pi: utilisez VLC pour diffuser la webcam: Logitech C920 [Vidéo H264 sans transcodage + Audio + Contrôle LED] - SpyCam / BabyCam

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?

7
LoneWanderer

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


0. Contrôles préliminaires

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:

  • v4l permet de contrôler la webcam. Il propose la commande v4l2-ctl ce qui nous permettra de contrôler et de configurer la webcam.
  • VLC qui n'est pas seulement un lecteur vidéo, mais qui possède également de puissantes capacités de streaming

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.


1. Configuration vidéo de la webcam

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

2. Identification du microphone

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

3. Diffuser en utilisant VLC

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.

  1. Diffuser sur HTTP

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:

  • les fenêtres
  • unix
  • mac
  • confirmé avec iPhone 7 (v11.2.1 (15C153)) avec l'application VLC (3.0.3 (305))

NB: Avoir la vidéo déjà en H264 1920x1080 30fps en sortie de la webcam permet d'économiser beaucoup de CPU RaspberryPi3 +.

  1. Différents conteneurs

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}}'

    1. Formater les noms de fichiers, les horodatages

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)

4.Faites de RaspberryPi3 + un point d'accès Wifi

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

5. Script au démarrage

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}'
  1. Méthode de base

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

  1. Une autre méthode: créer un service de démon

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.


6. [EDIT] Commandes supplémentaires: enregistrement en boucle infinie et vidéo partagée

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}'

7. [EDIT] Exécution du programme à un instant donné

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.


8. DÉPANNAGE

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
22
LoneWanderer