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.
- 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, consultev4l2-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 elarecord
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 ampga
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 +.
- 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}}'
- 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}'
- 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
- 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