lunes, 7 de enero de 2013

Streaming de video desde RaspberryPi (parte 1)

para ver tu webcam USB desde la red

Buenos días, espero que Los Reyes Magos se hayan portado bien. Este post es el primero de muchos relacionados con la transmisión de vídeo desde el RaspberryPi. La fuente de vídeo en este primer caso, es una webcam usb standard, de resolución ... pestosa ... comprada en DealExtreme por 4€. Vamos a ir configurando y comparando los resultados ...

Para la primera prueba vamos a usar mpeg-streamer y voy usar las instrucciones de esta web. Lo primero que hay que hacer, es comprobar que el sistema reconoce la webcam, para ello (tras conectar la webcam) ejecutamos:
dmesg
en mi caso el resultado es:
[    3.733746] usb 1-1.2.1: new high-speed USB device number 5 using dwc_otg
[    3.886477] usb 1-1.2.1: New USB device found, idVendor=0c45, idProduct=62f1
[    3.902072] usb 1-1.2.1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
[    3.916756] usb 1-1.2.1: Product: USB 2.0 Camera
[    3.928454] usb 1-1.2.1: Manufacturer: Sonix Technology Co., Ltd.
[    4.501337] udevd[137]: starting version 175
[    5.886469] Linux video capture interface: v2.00
[    6.082886] uvcvideo: Found UVC 1.00 device USB 2.0 Camera (0c45:62f1)
[    6.457483] input: USB 2.0 Camera as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2.1/1-1.2.1:1.0/input/input0
[    6.920295] usbcore: registered new interface driver uvcvideo
[    7.045062] USB Video Class driver (1.1.1)
[    7.489526] 5:3:1: cannot get freq at ep 0x84
[    7.547611] usbcore: registered new interface driver snd-usb-audio
y si ejecuto:
lsusb
el resultado es:
Bus 001 Device 005: ID 0c45:62f1 Microdia 
por lo que he tenido suerte y el sistema reconoce el dispositivo. De no ser así, la forma más rápida de localizar el driver, es buscando por el código del fabricante:producto , que en mi caso es 0c45:62f1.
Ahora resolvemos dependencias, bajamos y compilamos mpeg-streamer (5 minutillos):
apt-get update
apt-get install libjpeg8-dev imagemagick subversion
cd /usr/src/
svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make
¿quien dijo que compilar era difícil? Ahora hacemos la prueba de fuego:
./mjpg_streamer -i "./input_uvc.so -y -n " -o "./output_http.so -n -w ./www"
en la web que he indicado antes, no ponían el parámetro -y en el input, pero en mi caso es necesario, ya que me salia este error:
MJPG Streamer Version: svn rev: 3:172
 i: Using V4L2 device.: /dev/video0
 i: Desired Resolution: 640 x 480
 i: Frames Per Second.: 5
 i: Format............: MJPEG
Unable to set format: 1196444237 res: 640x480
 Init v4L2 failed !! exit fatal 
 i: init_VideoIn failed
Ahora vamos a un navegador y abrimos http://ip_del_raspberry:8080 En el menú de la izquierda seleccionamos "stream" y comprobamos la calidad y velocidad del video.
Como podemos ver, la calidad es exactamente la de la webcam (bien) pero hay un retraso, de por lo menos dos segundos (mal), no es del todo alarmante y a más de uno le servirá esto, y a mi casi casi que me sirve. Si quieres verlo desde un Android, selecciona en el menú de la izquierda "Javascript" (muy bien).
Pero hay un problema más. Si ejecutas un:
top
en mi caso:

lo que significa que mpeg-streamer está consumiendo cerca del 90% de los recursos del microprocesador del RaspberryPi, y eso no es admisible.
Es una pena, porque es realmente fácil, la calidad es la misma de la webcam, se puede ver desde el Android, pero no puedo permitir que un sólo recurso, acapare todo el micro. Esto se debe a que mpeg-streamer lanza una rágafa de campturas jpeg de la webcam y hace la transcodificación sobre la CPU en lugar de sobre la GPU. Así que este superpoder (por ahora) no convence del todo, hasta que encuentre un transcodificador sobre GPU.

45 comentarios:

  1. has visto este??

    http://patolin.com/blog/2012/12/12/video-vigilancia-con-el-raspberry-pi/

    ResponderEliminar
    Respuestas
    1. hola, lo vi hace tiempo. Creo que esto tampoco va a servir, porque no hay transcodificacion, ademas me faltaría el software de streaming. De todas formas, si quieres videovigilancia, te recomiendo Zoneminder, que tengo pendiente hacer un tutorial al respecto.

      Eliminar
  2. Buenas! Por curiosidad, ¿Puedes compartir el link de la webcam que has comprado?

    ¿Es esta? http://dx.com/p/mini-1-3m-pixel-usb-webcam-color-assorted-driver-free-42976

    ¿Funciona con enchufarla o hay que configurarla de alguna forma?

    Gracias!

    ResponderEliminar
    Respuestas
    1. tiene pinta de ser la misma, pero con otra carcasa. La que estoy probando es: http://dx.com/p/compact-usb-pc-webcam-300k-pixel-25948

      Eliminar
  3. Ante todo felicitarte por el blog, siempre espero con ansia una entrada nueva de este feed y mira que mi reader está que explota.

    Vale ya he tenido tiempo para probar este primero. y tengo que decir que mis resultados son muy satisfactorios.
    Consumo de CPU del 3% y un retardo que no llega ni a medio segundo.

    Tengo una raspberry pi de 512MB pero no creo que eso influya.

    Si quieres hacer pruebas con ella en algún momento ya en privado te paso mi ip, para que hagas las pruebas que quieras en remoto.

    Un saludo.

    ResponderEliminar
    Respuestas
    1. y ... porque a mi se pone al 90% y como 4 segundos de retraso? as seguido mis instrucciones y te sale mejor que a mi? jo ... "la ironia del blogero tecnologico"

      Eliminar
    2. Hola,
      suscribo lo que comenta Juan Carlos. De los tres métodos que has mostrado en los diferentes posts, este es el que mejor ha funcionado. Con mi webcam la carga no sube del 10% y apenas hay retraso en la imagen. Eso sí, quitando el parámetro "-y" del comando.

      Te sugiero que pruebes con otra webcam, ya que con la mia, el segundo método que has puesto no va y todo parece depender de si la webcam incluye compresión o no.

      Eliminar
    3. He aquí una prueba de que esta es la mejor opcion:
      http://www.youtube.com/watch?v=l1RJf-XwoIE

      Eliminar
    4. voy a tirar esa webcam a la basura y seguir mis propias instrucciones ;)

      Eliminar
  4. he seguido todo pasa a paso, y con la opción de -y me salía mal la imagen y quité el parámetro y tatachan!!! todo perfecto.

    Para tratar de ayudar, la webcam era una que estaba tirada por casa: una speed-link spectrum microphone webcam SL-6826 http://www.speedlink.com/?p=3&cat=1M&pid=18792&paus=1

    Por si ayuda.

    ResponderEliminar
  5. Muy bueno, esta todo muy claro pero como podria mandar lo q captura la cam a un servidor y ver el video stream en este??

    Un Saludo.

    Charlie

    ResponderEliminar
    Respuestas
    1. si lo dices por el tema del rendimiento, no vas a ganar mucho así, date cuenta que la captura, mezcla y envío la tienes que hacer en el raspberry. Si lo dices por usar algo como dlna o similar ... ni idea :)

      Eliminar
    2. Gracias por la respuesta JuanMol.

      Lo que quiero es realizar una videoconferencia entre dos Raspis. Alguna sugerencia?

      Por eso queria saber si modificando el comando ./mjpg_streamer -i "./input_uvc.so -f 30 -n " -o "./output_http.so -n -w ./www" se podria mandar a otra diraccion que no sea la de http://ip_del_raspberry:8080.

      Alguien sabe como encapsular el video de la cam en paquetes UDP??

      Eliminar
    3. o_O coooomo? 2 webcams + 2 raspis = 1 url? quieres ver dos webcams de dos raspberrys en una misma web?

      Eliminar
    4. Si lo que viene siendo una videoconferencia algo parecido al Skipe.

      Alguna sugerencia??

      Eliminar
    5. lo que necesitas entonces es un servidor de videoconferencias ¿no? Puedes usar un Hangout de GTalk o bien, que es lo mas interesante, usar Asterisk.
      Yo hace un millon de años, probé OpenMeeting, que tiene opciones de pizarra compartida y eso. Tenia un fork que se llamaba algo asi como BigBlueButton, además lo integré con Asterisk, muy fácil.

      Eliminar
    6. Gracias por la respuesta Juan.

      Si eso es necesito un servidor de videoconferencias probare con Asterisk y si tengo alguna duda ya te comentare oka.

      Un Saludo

      Eliminar
  6. es posible hacer streaing por rtp en vez de por http?

    ResponderEliminar
    Respuestas
    1. por supuesto, cambiando el parámetro output_http.so por el del rtp :)

      Eliminar
    2. muchas gracias,

      el problema que me sale que no encuentra el pluging, y nose como añadirlo

      tambien he probado por udp, porque ese plugig si em lo encuentra, pero luego al leerlo con VLC, pongo la ip de la ras`pberry y no me reproduce nada

      Eliminar
  7. Muchas gracias por el tuto
    sigo los pasos pero cuando pongo "make" me dice "command not found"
    ¿Que puedo hacer?

    ResponderEliminar
    Respuestas
    1. apt-get install build-essential
      yo ya lo tenia instalado de otras compilaciones

      Eliminar
  8. Gracias Juan por tu rapida respuesta
    ¿Pongo eso en lugar de "make"?

    ResponderEliminar
    Respuestas
    1. no no sorry. Tienes que ejecutar eso antes del make. Te faltaba el comando, y lo instalas, junto con el resto de herramientas de compilación con el build-essential. Así que:
      1- apt-get install build-essential
      2- make

      Eliminar
  9. Lo intento el lunes que viene, que tengo un viaje hoy, y ya te comento los resultados.
    Gracias crack!

    ResponderEliminar
  10. Tengo una cámara Logitech C170 corriendo con el MJPEG-Streamer y con una resolución de 320x240 tengo cerca de 10 FPS con un lag de menos de un segundo (Aproximadamente 0.5 segundos), con 640x480 tengo cerca de 4 cuadros por segundo pero muy entre cortados (prefiero menor resolución a mayor fluidez). Podrías intentar esta resolución para ver si te convence, a esta resolución la carga del CPU no supera el 25%, de hecho el RPi lo tenemos como cerebro de un robot móvil y además de mandar el stream también esta al tanto de un socket TCP y responde con mucha fluidez.

    ResponderEliminar
  11. hola muy buen tutorial, me jala de maravillas apenas alcanza el segundo de retraso, y una pregunta como hago para que pueda ver el stream desde internet?

    ResponderEliminar
    Respuestas
    1. tienes que poner una regla de NAT en el router, de forma que el puerto 8080 apunte a la ip del raspberry, al mismo puerto.

      Eliminar
  12. Hola que tal amigo sabes despues de coloco el comando
    ./mjpg_streamer -i "./input_uvc.so -y -n " -o "./output_http.so -n -w ./www"

    me sale el prompt :
    >

    asi se queda no me aparece nada no sabes que pudiera ser?? o que mas tengo que hacer ya que al intentar abrir el navegador con la ip de rasp:8080 no me sale nada ni en la terminal ni en el navegador

    ResponderEliminar
    Respuestas
    1. eso pasa uando te dejas una ' o " por el camino o bien nos traiciona el copy paste, que creo que es lo te pasa. Escribe la linea a mano y asegurate de tener un numero par de ' y "

      Eliminar
  13. Tengo un problema con este comando

    svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

    A la hora de introducirlo, la Raspberry me escupe "svn: E175011: El repositorio se movió permanente a '%'s; use 'relocate' por favor"

    ¿Cómo puedo solucionarlo? Muchísimas gracias Juan, me encanta tu blog.

    ResponderEliminar
    Respuestas
    1. prueba con svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code

      Eliminar
    2. Vale, me ha funcionado perfectamente. Gracias Juan.

      Ahora tengo un problema al arrancar el streamer. Cuando no pongo la -y me sale lo mismo que a tí, y cuando la pongo, me sale otra cosa parecida:

      MJPG Streamer Version: svn rev: 3:172
      i: Using V4L2 device.: /dev/video0
      i: Desired Resolution: 640 x 480
      i: Frames Per Second.: 5
      i: Format............: YUV
      i: JPEG Quality......: 80
      Unable to set format: 1448695129 res: 640x480
      Init v4L2 failed !! exit fatal
      i: init_VideoIn failed

      Y ahí me he quedado y no puedo hacer nada. Saludos

      Eliminar
    3. tu camara tiene otro formato, no le pongas el parametro -y

      Eliminar
    4. Lo pongo tal que así: ./mjpg_streamer -i "./input_uvc.so -n " -o "./output_http.so -n -w ./www"

      Y me sale:

      MJPG Streamer Version: svn rev: 3:172
      i: Using V4L2 device.: /dev/video0
      i: Desired Resolution: 640 x 480
      i: Frames Per Second.: 5
      i: Format............: MJPEG
      Unable to set format: 1196444237 res: 640x480
      Init v4L2 failed !! exit fatal
      i: init_VideoIn failed

      Muchas gracias Juan.

      Eliminar
    5. cuando te sale ese fallo, te devuelve el prompt? o tienes que matarlo con ctrl+c?

      Eliminar
    6. Me devuelve al prompt. Pues me sale nada más poner la línea que he dicho antes. La cámara es la de la PS2.

      Eliminar
    7. el eyetoy es del tipo mjpg-encoder, las buenas para estos menesteres. Me prestaron una no hace mucho y probé esto mismo sin problemas. Prueba ponerle otra vez -y y cambia la resolución a 320x240

      Eliminar
    8. Milagrosamente, he reiniciado la raspy, he desconectado la camara y vuelto a conectar. Ahora me funciona a la resolucion de 640, sin embargo, al meterme en la web, sale una imagen verde con una raya gris arriba. Probado también a 320x240 y lo mismo. Hago un top y mjpg-streamer me ocupa un 97.7% de CPU.

      Algo no va bien :S

      Eliminar
    9. a mi no me llegó a ir fina fina, creía que la cámara estaba estropeada, pero por lo que me cuentas, lo que no esta bien es el driver :-/ a mi me mezclaba la mitad izquierda con la derecha y alguna cosa más.

      Eliminar
  14. A mi me esta haciendo lo mismo....

    pi@rasphome:/usr/src$ sudo svn co https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer

    svn: E175011: El repositorio se movió permanente a '%'s; use 'relocate' por favor

    y no se como solucionarlo, alguien puede ayudarnos.....

    Gracias y Saludos
    Victor

    ResponderEliminar
  15. Buenas, aqui:

    http://www.bobtech.ro/tutoriale/raspberry-pi/78-streaming-webcam-in-format-m-jpg-cu-raspberry-pi#rpi-mjpg-streamer

    está el mjpg_streamer ya compilador para la Raspberry. La página está en rumano, pero se entiende bastante bien.

    ResponderEliminar
    Respuestas
    1. gracias por la info. Cierto es que tarda 10 segundos en compilar, pero gracias ;)

      Eliminar
  16. He desarrollado una interfaz en Java para capturar el MJPEG de la una webcam (logitech C170), a 30 fps y a una resolución de 320x240 tengo un retraso de menos de medio segundo, lo que me hace pensar que el navegador no da prioridad al renderizado, he tenido problemas con las últimas pruebas, ya que el raspberry pi crashea después de rato (la linea de comando se congela), aun no doy con el problema de esto.

    ResponderEliminar
  17. La Pi necesita "registro y pago" para MPEG por hardware, no así para MP4 pro tanto webcam MP4 mejor

    ResponderEliminar