Cómo transmitir video desde la cámara Raspberry Pi y verlo en vivo

93

Soy nuevo en la Raspberry Pi e incluso nuevo en la cámara Raspberry Pi. He visto muchos tutoriales en línea para la cámara Raspberry Pi, pero aún no he encontrado nada que me permita transmitir directamente desde la cámara Raspberry Pi como lo puede hacer con una cámara web (usando SimpleCV u OpenCV). Esperaba que alguien pudiera señalarme en la dirección correcta.

Ingeniero en ciernes
fuente
probaste mjpgstreamer? Shell publico la solución?
jaromrax
3
Las personas que buscan una solución de latencia cero deben consultar raspberrypi.stackexchange.com/a/32521/30681
igaurav el
Si tiene ssh y mpv: ssh raspberrypi raspivid -o - -t 0 -fps 25 -w 640 -h 360 | mpv - --speed 2 --fps 25(el "--speed 2" evita que se retrase demasiado).
Metamórfico el

Respuestas:

81

La solución sugerida por Diego es buena, excepto que es bastante lenta y tiene un gran retraso de video ya que el VLC allí retransmite una transmisión del raspvid. Desde el 12/2013, hay un controlador oficial v4l2 disponible: http://www.ics.com/blog/raspberry-pi-camera-module#.VJFhbyvF-b8 Esto hace que la transmisión retransmitida sea obsoleta. Simplemente cargue el módulo y úselo:

sudo modprobe bcm2835-v4l2
cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}'

Esto crea una secuencia http en el puerto 12345, también puede usar otros formatos, como el rtcp de la respuesta de Diego. Lea más sobre esto aquí: https://web.archive.org/web/20151012014829/http://www.videolan.org:80/doc/streaming-howto/en/ch03.html

Laos
fuente
2
En esta respuesta , se sugiere añadir :demux=264a CVLC porque la corriente es h264 RAW y hay que establecer el demuxer: cvlc v4l2:///dev/video0 --v4l2-width 1920 --v4l2-height 1080 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:12345}' :demux=264. Eso hace posible ver la transmisión en VLC para Android, por ejemplo.
Jaime M.
8
En el enlace provisto, en lugar de autoreconf -vfiahora debería usar./bootstrap.sh
JuJoDi
1
¿Hay alguna manera que me permita transmitir el video y también guardarlo en la tarjeta SD RPi?
O Weinberger
44
El enlace videolan.org/doc/streaming-howto/en/ch03.html está muerto.
Kal
44
Creo que vale la pena señalar / confirmar que este método no funciona en un entorno sin cabeza. Recibo errores, uno de los cuales habla sobre X11
Nick
41

Hay varias opciones entre las que puede elegir. En mi trabajo, estamos usando VLC para transmitir videos capturados por la cámara Raspberry Pi desde nuestras salas de servidores a la oficina. Una desventaja de esto es que hay un retraso de aproximadamente 5 segundos y no he encontrado una solución para esto. La siguiente es nuestra configuración:

  1. Instale y actualice raspbian y asegúrese de que su cámara esté habilitada (habilite esto ejecutando sudo raspi-config y seleccione Enable Camera)

    sudo apt-get update
    sudo apt-get upgrade
    
  2. Instalar vlc

    sudo apt-get install vlc
    
  3. Cree un script para iniciar la transmisión con el siguiente contenido o ejecute el comando (no puede hacer nada más si solo ejecuta el comando).

    sudo nano myscript.sh
    raspivid -o - -t 0 -hf -w 640 -h 360 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554}' :demux=h264
    
  4. Hacer el guión ejecutable

    sudo chmod +x myscript.sh
    
  5. Si desea iniciar la transmisión automáticamente, debe agregar el script a crontab. Para que esto funcione, tuve que hacer otro script ejecutado por cron (OBS! VLC no se puede ejecutar como sudo, así que asegúrese de estar en el cron correcto). sudo nano myscript2.sh:

    #!/bin/bash
    /path/to/myscript.sh
    

    Entonces:

    sudo chmod +x myscript2.sh
    crontab -e
    @reboot /path/to/myscript2.sh
    
  6. Para ver la videostream, abra VLC en una computadora en la misma red que la Raspberry Pi que está utilizando para la transmisión. Presione Medios -> Abra Networkstream y pegue lo siguiente en el campo:

    rtsp://[IP].[TO].[THE].[PI]:8554/
    

Si no le importan los FPS (cuadros por segundo) y no desea ningún retraso, puede usar MJPEG. Puedes leer más sobre esto AQUÍ

Mira ESTE wiki sobre el módulo de cámara Raspberry Pi. Espero que encuentres lo que estás buscando.

Diego
fuente
¿Alguna idea de por qué obtendría lo siguiente en VLC en Windows? Su entrada no se puede abrir: VLC no puede abrir el MRL 'rtsp: //192.168.1.78: 8554'. Consulte el registro para más detalles. El lado Pi parece estar bien, ¿no hay errores y parece reaccionar al cliente conectado?
monojohnny
@monojohnny ¿Se transmite la frambuesa pi? Compruebe si el video realmente está funcionando conectando una pantalla. Si el video funciona, debería ver la transmisión en la pantalla conectada a la frambuesa pi.
Diego
@monojohnny Gracias por el artículo Diego ... ¡funciona perfectamente en el primer intento! monojohnny ... tienes que poner el "/" al final de lo contrario vlc se queja. Pruebe esto: rtsp: //192.168.1.78: 8554 /
Sujay Phadke
Gracias @ Diego esto funcionó muy bien para mí, pero ¿cómo salgo de mi transmisión?
Denoteone
Tengo el mismo problema en Windows y no puedo transmitir el video desde mi pi. dado que veo la transmisión de video de la cámara pi en una pantalla conectada a la pi pero no a través de VLC instalado en mi PC con Windows 10.
Mostafa
23

Probé algunas opciones. Sin embargo, encontré el mejor resultado usando ese proyecto: RPi-Cam-Web-Interface de la comunidad eLinux

la transmisión tiene casi cero retraso.

buena suerte :)

usuario2998302
fuente
44
Las personas que buscan latencia cero, verifique esto con seguridad. Atrezzo a @ user2998302. No puedo creer, por un año esto no hay votos positivos (reconocimiento) sobre esto.
igaurav
Si bien esta es una configuración rápida y fácil, el software está lejos de estar optimizado, por lo que si bien es de baja latencia (no existe la latencia cero), la interfaz es muy parlanchina y utiliza algunos ciclos de CPU adicionales. No es un problema si no está ejecutando nada más, pero podría serlo si lo está, especialmente en un Pi 1.
Nick
¡Esto es asombroso!
Hamza Ouaghad
La transmisión de video web más rápida hasta ahora entre las que he probado (también el controlador nativo v4l2 transmitido a través de vlc), latencia casi nula. No tiene sentido quejarse de la optimización, mientras que todos los recursos en Internet con respecto a este problema no obtendrán mejores resultados que esta aplicación.
Gabber
woah, debo admitir que este rocas!
L.Trabacchin
18

La forma más fácil que he encontrado es obtener una videoalimentación en vivo de una frambuesa pi sin cabeza, con una cámara de frambuesa pi.

Esta solución funciona de inmediato, sin instalar software adicional en el PI.

En el PI:

raspivid -t 0 -l -o tcp://0.0.0.0:3333

En la computadora, uno puede transmitir con VLC:

vlc tcp/h264://192.168.66.154:3333

(suponiendo que 192.168.66.154 es la dirección IP del PI)

Por Hansen
fuente
¡Bienvenido a Raspberry Pi! En general, desaconsejamos copiar sus respuestas textualmente de una pregunta a otra: una vez que alcance 15 rep, podrá marcar preguntas que sean idénticas como 'duplicadas' para que solo haya una copia de su respuesta. ¡Gracias por compartir tu respuesta al problema, sin embargo!
Aurora0001
@Per Hansen No funciona para mí ... Puede que haya algo más que deba hacerse aparte de asignar un puerto.
Amit Ray
¡Esto funciona muy bien! Usando un RPi3B + y Raspbian 9.4 (estiramiento) sin cabeza.
dparkar
5

Publiqué una posible solución en el foro de frambuesa utilizando un servidor RTSP ligero basado en live555 que se alimenta con un controlador V4L2 que admite la captura H264:

sudo modprobe -v bcm2835-v4l2
git clone https://github.com/mpromonet/v4l2rtspserver.git
cd v4l2rtspserver
cmake .
make install
v4l2rtspserver -H <height> -W <width> -F <fps>

A continuación, debería poder acceder a la secuencia RTSP utilizando:

vlc rtsp://<raspberry>:8554/unicast
mpromoneta
fuente
¿Qué pasa con el retraso de tiempo?
kuhajeyan
más corto que cvlc.
mpromonet el
cmake se quejó de "NO se pudo encontrar ALSA (falta: ALSA_LIBRARY ALSA_INCLUDE_DIR)", hasta que agregué algunos paquetes más para mi proyecto. La solución está dentro de estos: "sudo apt-get install libopus-dev libexpat1-dev libasound2-dev libudev-dev libavahi-client-dev" (supongo que aquí puede ser suficiente).
MoonCactus
Ah, y funciona bastante bien (solución ligera), gracias. El lapso de tiempo es decente, aproximadamente 2 segundos si se compara favorablemente con otras soluciones en mi humilde opinión.
MoonCactus
@MoonCactus: creo que arreglé la instalación de ALSA (solo necesita libasound2-dev). El retraso debería ser inferior a un segundo, si usa vlc, podría reducir el almacenamiento en la red usando --network-caching 300
mpromonet
4

UV4L (también) admite transmisión estándar de video y audio HTML5 sin necesidad de configuración. También son posibles otras opciones, como MJPEG sobre http.

Actualizar:

UV4L ahora también es compatible con la transmisión de audio y video en vivo a Jitsi Meet Rooms a través de la Web. No se requiere una configuración especial. Es tan fácil como escribir su nombre, sala y hacer clic en Iniciar .

2da actualización:

UV4L ahora también admite video codificado por hardware H264, a fps completos, HD y posiblemente Full HD en el futuro.

prinxis
fuente
1
Lo único es que solo puedes obtener el flujo elemental que prácticamente todo lo que NO entiende. No mucho uso, lamentablemente. Necesita algo para emitir WebRTC (que si tiene un Pi2 y posterior, puede hacerlo con UV4L. Si necesita (debido a la restricción de potencia / tamaño) un cero para hacer esto, su SOL.
Svartalf
3

Ambos mjpeg_streamery motionparecen tener mejor latencia que cvlc.

Utilizando mjpg_streamer

mjpeg_streamer requiere compilación pero las instrucciones en el github son sencillas.

Después de la compilación, se puede ejecutar iniciando start.shdesde el directorio del proyecto o directamente (en el directorio del proyecto):

./mjpg_streamer -i "./input_uvc.so -rot 180" -o "./output_http.so -w ./www -p 8090"

donde 8090esta el puerto TCP Si no se especifica, el puerto 8080se usará de manera predeterminada. El start.shscript contiene algunos ejemplos de uso con opciones adicionales.

Utilizando motion

Motion incluye un servicio systemd que facilita el inicio automático al arrancar, detener o reiniciar.

Para usarlo en el modo de cámara web IP, se deben establecer las siguientes configuraciones /etc/motion/motion.conf:

daemon on
stream_localhost off
output_pictures off
ffmpeg_output_movies off
stream_maxrate 24
framerate 24
width 640
height 480

A continuación, en /etc/default/motionconjunto:

start_motion_daemon=yes

Para hacer que el servicio se inicie automáticamente en el arranque:

systemctl enable motion

Úselo systemctl start/stop/restart motionpara la acción correspondiente.

El puerto de transmisión predeterminado es 8081. El puerto se establece en stream_portin /etc/motion/motion.conf.

ccpizza
fuente
1

No sé si está buscando un software de vigilancia, pero he logrado instalar y ejecutar motionun software de detección de movimiento. Deberías echar un vistazo en la guía oficial .

Morgan Courbet
fuente
El movimiento solo se aplica a las cámaras USB
geneorama
3
@geneorama motion utiliza la interfaz video4linux que no está restringida a la cámara USB, el módulo bcm2835-v4l2 da acceso a la placa de la cámara a través de esta interfaz.
mpromonet
1

He podido transmitir video usando uv4l WebRTC en Raspberry Pi 2. Es muy fácil. Solo sigue este tutorial. Espero esta ayuda

bdsys
fuente
Incluya partes relevantes del tutorial aquí, para evitar la pudrición del enlace.
Bex
Solo aplicable en Pi2 y superior. No funciona con 1A / 1A + / Zero. No estoy completamente seguro de por qué no puede hacerlo, ya que la gente parece ser capaz de hacerlo, pero oye ...
Svartalf
1

Estaba teniendo problemas para obtener la transmisión de video en Windows 7. Había muchas soluciones de Linux, no podía replicarlas en Windows hasta ahora. Finalmente obtuve una solución bastante rápida:

  1. obtenga una versión de netcat para Windows: http://joncraton.org/files/nc111nt.zip , descomprímalo y agréguelo a la ruta
  2. obtenga una nueva versión de mpc-hc, que puede leer desde stdin: https://mpc-hc.org/downloads/ install y agregue su ruta a la ruta también (la mía es de 64 bits, pero con suerte 32 bits lo hará también)

En frambuesa pi:

raspivid -t 0 -w 1024 -h 768 -fps 20 -b 1000000 -o - | nc your.receiver.ip.address 5001

En la máquina de Windows:

nc -l -p 5001 | mpc-hc64 -

Por lo tanto, creo que nada se vuelve a empacar o se transmite, se remueve o lo que sea. La corriente binaria de raspvid se alimenta a mpc y se muestra. Mi frambuesa funciona a través de wifi, así que al principio obtengo un retraso considerable, que en cuestión de medio minuto se reduce a esos 0.2-0.3 segundos de retraso.

Desafortunadamente, no pude usar vlc de la misma manera, ya que nc -l -p 5001 | vlc -solo abre la ventana vlc sin ningún video.

Grigory Makeev
fuente
1

Utilicé Nginx con soporte RTMP para transmitir al mundo, junto con avconv para procesar la entrada de la cámara. El código está disponible en Github .

TTT
fuente
Buena, ¿compartirías alguna experiencia sobre el retraso del video?
kuhajeyan
2
Sí, hubo un retraso de unos 5 segundos.
TTT
0

Si bien el código de Peter Hansen posiblemente funciona bien en una LAN, por razones de integridad: TCP se trata de la integridad de los datos en comparación con el tiempo real. En una transmisión en tiempo real, alguna pérdida de datos puede ser aceptable en aras de una visualización oportuna. En este caso UDP puede ser mejor. No he probado ese código.

Si se trata de una cámara de seguridad, se puede considerar la multidifusión. Los enrutadores modernos pueden hacerlo incluso en los modelos de $ 100.

Cuenta
fuente
0

He instalado una solución ONVIF de https://github.com/BreeeZe/rpos en mi pi, siguiendo las instrucciones en README.md .

La única diferencia es que lo he instalado node v8.4.0. Esto me permite ver la salida de mi cámara en un NVR conectado en la misma red. Además, la cámara se puede reproducir directamente a través de la transmisión de red del reproductor VLC usando la direcciónrtsp://192.168.1.3:8554/h264

KrIsHnA
fuente
0

Un tiempo, un intento tuvo un problema similar con esto:

https://www.npmjs.com/package/ws-avc-player

Es más básico que otras soluciones propuestas, pero creo que funciona bien si la baja latencia en la web es la prioridad.

Funciona en la mayoría de los navegadores (incluso móviles a 480p) sin necesidad de complementos en el navegador.

MatijaG
fuente
No escribí el decodificador en sí, es un proyecto separado github.com/mbebenita/Broadway Sin embargo, está sorprendentemente bien optimizado y, como dije en la respuesta, puede manejar fácilmente un 480p en un droide. La razón por la que elegí Brodway es porque no hay un codificador de hardware vp8 / 9 en rpi, por lo que h264 es realmente la única opción decente. Pero si desea utilizar el decodificador h264 nativo en el navegador, puede olvidar la baja latencia.
MatijaG
Suena tan increíble que tengo que intentarlo.
kwasmich
Cualquier comentario será muy bienvenido :)
MatijaG
Solo que ahora tenía algo de tiempo libre. Tengo problemas para que el ejemplo funcione con la raspividalimentación de la cámara. Por ffmpegotro lado, solo obtengo la décima parte de los cuadros por segundo. Usé un Raspbian limpio y un Pi Zero. ¿Tienes algunas pistas para mí?
kwasmich
Sí, con ffmpeg será imposible debido a la falta de aceleración de hardware. Intente ejecutar el ejemplo con: node example/index.js raspividDebería funcionar de inmediato si tiene problemas, intente ejecutarlo solo node example/index.jsy por separado /opt/vc/bin/raspivid -pf baseline -ih -t 0 -w 640 -h 480 -hf -fps 15 -g 30 -o - | nc localhost 5000y vea si obtiene algún error de raspivid
MatijaG