Saltar al contenido

Raspberry Pi: use VLC para transmitir la cámara web: Logitech C920 [H264 Video without transcoding + Audio + LED control] – SpyCam / BabyCam

Solución:

Esta solución está probada y funciona con las versiones que se indican a continuación. Usando este método, el RaspberryPi3 siempre tiene alrededor del 5% de CPU.

editar 2018-11-18: También se puede ver el prototipo de la solución todo en uno en la página de inicio del proyecto RaspiVWS (para personas curiosas, consulte el proyecto GitHub)

0. Controles preliminares

1. Configuración de video de la cámara web

2. Identificación de micrófono

3. Transmitir usando VLC

4.Haga de RaspberryPi3 + un punto de acceso Wifi
(Si no tiene una red existente para conectar su Pi)

5. Script al inicio o como servicio

6. [EDIT] Comandos adicionales: grabación de bucle infinito y video dividido

7. [EDIT] Ejecución del programa en un instante dado

8. [EDIT] SOLUCIÓN DE PROBLEMAS


0. Controles preliminares

La respuesta es trabajar con Raspbian 9.4 Stretch. Verifique su versión con el siguiente comando:

lsb_release -a

Deberías ver:

No LSB modules are available.
Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 9.4 (stretch)
Release:        9.4
Codename:       stretch

Podemos confiar en las siguientes herramientas:

  • v4l permite controlar la webcam. Ofrece el mando v4l2-ctl lo que nos permitirá controlar y configurar la webcam.
  • VLC, que no solo es un reproductor de video, sino que también tiene potentes capacidades de transmisión

Puede instalarlos con los siguientes comandos:

sudo apt-get install vlc
sudo apt-get install v4l-utils

Una vez que todo esté instalado, puede configurar su cámara web C920.


1. Configuración de video de la cámara web

v4l2-ctl --all enumera todos los dispositivos disponibles y su configuración

[email protected]:~ $ 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

Las últimas 2 líneas nos dan pistas para controlar el indicador LED incorporado, por ejemplo, para desactivar el indicador LED. los -d0 El parámetro indica en qué dispositivo se debe aplicar la modifcación (si tiene varias cámaras o el nombre de su dispositivo cambiado)

v4l2-ctl -d0 --set-ctrl=led1_mode=0
v4l2-ctl -d0 --set-ctrl=led1_frequency=30

2. Identificación de micrófono

El comando arecord -l nos dará la lista de dispositivos ALSA. (ALSA es el administrador de audio en RaspberryPi)

[email protected]:~ $ 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

Esto significa que el micrófono incorporado está ubicado en hardware 1, periph 0. Puede verificar eso en la línea de comando con alsamixer -c 1 -V capture

3. Transmitir usando VLC

VLC se puede iniciar usando la línea de comando. Dado que no tenemos video y audio ya mezclados en un solo acceso de transmisión, debemos pedirle a VLC que lo haga. Es el papel del transcoding característica de VLC.

  1. Transmitir a través de HTTP

También queremos transmitir a través de HTTP, VLC también puede lograrlo.

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

Explicación

  • v4l2:///dev/video0:chroma=h264 proporciona datos de entrada VLC: toma la transmisión de video de / dev / video0 y que es una codificación h264 (si su cámara web es el dispositivo de video 0, también podría ser otro número, consulte v4l2-ctl --all mando)
  • :input-slave=alsa://hw:1,0 le dice a VLC que tome otro flujo de entrada con el video. Es el flujo de audio identificado por el arecord encima
  • --sout le dice a VLC cómo manejar el flujo de salida
  • #transcode{acodec=mpga,ab=128,channels=2,samplerate=44100,threads=4,audio-sync=1} le dice a VLC que convierta el audio a mpga códec, 128 kbits / s, 2 canales, muestreo de 44100 Hz, utilizando los 4 núcleos RaspberryPi3 +. audiosync es opcional. Me tomó un tiempo darme cuenta de esto: la transmisión de video de la cámara web h264 se mantiene como se proporciona (sin transcodificación de video).
  • :standard{access=http,mux=ts,mime=video/ts,dst=:8099} le dice a VLC que proporcione flujo a través de HTTP en el puerto 8099 con el formato de muxing TS.

En cualquier otro dispositivo, puede usar VLC para acceder a su flujo RaspberryPi3 + VLC:
vlc http://<raspberrypi-ip>:8099

Funciona con cualquier cliente VLC:

  • ventanas
  • unix
  • Mac
  • confirmado con iPhone 7 (v11.2.1 (15C153)) con la aplicación VLC (3.0.3 (305))

NB: Tener el video ya en H264 1920×1080 30fps en la salida de la cámara web ahorra una gran cantidad de CPU RaspberryPi3 +.

  1. Diferentes contenedores

También puede grabar en varios contenedores, o incluso contenedores + flujo, aquí hay algunos ejemplos:

  • grabar 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"}'

  • grabar 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"}'

  • grabar + stream
    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. Dar formato a nombres de archivo, marcas de tiempo

También puede utilizar cadenas formateadas para nombres de archivos. Comando de prefijo como este:

cvlc --sout-file-format v4l2:///dev/video0:<...> dst="/home/pi/Webcam_Record/%F_%T_MyVid.mp4"}

Producirá un archivo llamado YYYY-MM-DD_HH:MM:SS_MyVid.mp4 (: están autorizados en los nombres de archivo Unix, pero no en los nombres de archivo de Windows)

4.Haga de RaspberryPi3 + un punto de acceso Wifi

Si no tiene una red existente para conectar su Pi a: Puede seguir las instrucciones del sitio web oficial de RaspberryPi3 +: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md

De lo contrario, si ya tiene una red, puede conectarse a su pi usando su IP. Ver parte 3

En cualquier otro dispositivo, puede usar VLC para acceder a su flujo RaspberryPi3 + VLC: vlc http://<raspberrypi-ip>:8099

5. Script al inicio

Puedes poner muchos comandos en un archivo bash my_bash_file.sh. Por ejemplo :

#!/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étodo básico

A continuación, puede hacer el rc.local script use su script personalizado para ser ejecutado al inicio. Puede seguir las instrucciones del sitio web oficial de RaspberryPi3 +: https://www.raspberrypi.org/documentation/linux/usage/rc-local.md

  1. Otro método: crear un servicio demoníaco

Crearemos un servicio “webcam-stream”, asumiendo que todos los comandos bash necesarios están ubicados /home/pi/Webcam_Record/vlc_webcam_stream_service.sh

cd /lib/systemd/system/
sudo nano webcam-stream.service

Y escribe en él:

[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

Haga que el archivo de servicio y el script sean ejecutables:

sudo chmod 644 /lib/systemd/system/webcam-stream.service
chmod +x /home/pi/Webcam_Record/vlc_webcam_stream.sh

Permitir que VLC se ejecute como root:

sudo sed -i 's/geteuid/getppid/' /usr/bin/vlc

Recarga demonios y habilita nuestro servicio:

sudo systemctl daemon-reload
sudo systemctl enable webcam-stream.service

Compruebe que esté reconocido y funcionando:

sudo service webcam-stream status
sudo service webcam-stream start

Puede verificar con otra computadora que el video se transmite correctamente. Tenga en cuenta que la cámara web no estará disponible mientras se esté ejecutando el servicio.


Una vez que haya terminado, puede conectarse al punto de acceso wifi RaspberryPi3 + y acceder a su transmisión de video.


6. [EDIT] Comandos adicionales: grabación de bucle infinito y video dividido

Los siguientes scripts de bash permiten la grabación infinita de videos de 15 s de duración con nombres de archivo con marca de tiempo y transmisión

#!/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] Ejecución del programa en un instante dado

EDITAR 04 ago 2018

Para iniciar la ejecución hoy a las 14:00, puede usar el siguiente comando:

./my_vlc_webcam_script.sh | at 1400

Ver el at manual de comandos para más detalles.


8. SOLUCIÓN DE PROBLEMAS

EDITAR 07 jul 2018

Recientemente me encontré con un error de VLC después de una actualización de 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 solución que encontré es iniciar VLC en modo GUI y cambiar el dispositivo de audio predeterminado a ALSA (en lugar de Automático). También puedo hacerlo en la línea de comandos. Vea la solución que se encuentra aquí Problemas de VLC con PulseAudio

cvlc -A alsa,none --alsa-audio-device default
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *