Archivo para 'transcodificador'

Streaming de video desde RaspberryPi (parte 4)

Con la Raspicam (Raspberry Pi Camera Board)

Bueno, despues de 583 intentos más, retomo el tema del videostreaming, en este caso con la raspicam, la cámara "oficial" de Raspberry Pi, con muy buena pinta, no muy cara ... pero que en mi caso es un poco desilusionante (por ahora).

No voy a entrar a especificar como instalar y probar la raspicam, porque para eso tenemos la web oficial, con todo explicado muy clarito.
Una vez que hemos comprobado que efectivamente funciona, te darás cuenta que no te crea un dispositivo de video linux, del tipo /dev/videoX, como si haría cualquier webcam usb. Se supone que como está en beta (seguramente nunca pasará de ahí) "si quieres que haga algo, prográmalo tú mismo"
¿Y esto qué quiere decir? Pues que en realidad la raspicam es un dispositivo externo de vídeo  por lo que la vamos a pasar canutas para poder trastearla.
Después de pelearme con el cacharro y ver 200 ejemplos en youtube, google, foros, grupos ... he visto que la mejor forma de usarla para hacer streaming, es capturando fotos, por lo que la característica de "30 fps a 1080p", mejor la vamos olvidando.
Bueno, necesitamos mjpg-streamer, que he instalado de nuevo siguiendo mis propias instrucciones.

Capturando fotogramas

Vamos a tener una tasa de refresco de 2 FPS (más o menos) con hasta 1080p de calidad. Para ello ejecutamos:
mkdir /tmp/stream/
raspistill -w 640 -h 480 -q 10 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0
Esto captura a la calidad que le indiquemos (640x480 para las pruebas) y lo guarda continuamente en un único archivo de imagen /tmp/stream/pic.jpg. La calidad esta a un 10% (parámetro -q), cuanto más la aumentes, más ancho de banda necesitarás.

Captura a 640x480:
Captura a 1920x1080:

Configurando el streaming

Como ya he comentado, necesitamos tener instalado el mjpeg-streamer. Para lanzarlo correctamente, ejecutaremos:
cd /usr/src/mjpg-streamer/mjpg-streamer/
/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/stream/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"
Creo que no necesita más explicaciones. Ahora desde un navegador (que puede ser el del Android) vamos a http://ip_del_raspberry:8080 y ahí veremos una web con varios ejemplos, vamos al menú de la izquierda y seleccionamos stream, que es el más compatible. Puedes directamente ir a http://ip_del_raspberry:8080/stream_simple.html que de hecho es la url que tendrás que configurar en ZoneMinder o cualquier otro.

Resultados

En la parte de calidad, es perfecto, 1080p, ahí no hay quejas. La tasa de refresco es algo baja, unos 2 FPS, pero aún así es mayor que las cámaras de seguridad convencionales.
La mejor parte es sin duda la carga de micro, que no llega ni al 2%:
Lo siguiente es combinar la raspicam con dos servos para hacer una torreta de vigilancia e integrarla con OpenCV para detectar movimientos, gestos, caras y personas. Y posiblemente le ponga un arma para matar zombies.

Streaming de video desde RaspberryPi (parte 4)

Con la Raspicam (Raspberry Pi Camera Board)

Bueno, despues de 583 intentos más, retomo el tema del videostreaming, en este caso con la raspicam, la cámara "oficial" de Raspberry Pi, con muy buena pinta, no muy cara ... pero que en mi caso es un poco desilusionante (por ahora).

No voy a entrar a especificar como instalar y probar la raspicam, porque para eso tenemos la web oficial, con todo explicado muy clarito.
Una vez que hemos comprobado que efectivamente funciona, te darás cuenta que no te crea un dispositivo de video linux, del tipo /dev/videoX, como si haría cualquier webcam usb. Se supone que como está en beta (seguramente nunca pasará de ahí) "si quieres que haga algo, prográmalo tú mismo"
¿Y esto qué quiere decir? Pues que en realidad la raspicam es un dispositivo externo de vídeo  por lo que la vamos a pasar canutas para poder trastearla.
Después de pelearme con el cacharro y ver 200 ejemplos en youtube, google, foros, grupos ... he visto que la mejor forma de usarla para hacer streaming, es capturando fotos, por lo que la característica de "30 fps a 1080p", mejor la vamos olvidando.
Bueno, necesitamos mjpg-streamer, que he instalado de nuevo siguiendo mis propias instrucciones.

Capturando fotogramas

Vamos a tener una tasa de refresco de 2 FPS (más o menos) con hasta 1080p de calidad. Para ello ejecutamos:
mkdir /tmp/stream/
raspistill -w 640 -h 480 -q 10 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0
Esto captura a la calidad que le indiquemos (640x480 para las pruebas) y lo guarda continuamente en un único archivo de imagen /tmp/stream/pic.jpg. La calidad esta a un 10% (parámetro -q), cuanto más la aumentes, más ancho de banda necesitarás.

Captura a 640x480:
Captura a 1920x1080:

Configurando el streaming

Como ya he comentado, necesitamos tener instalado el mjpeg-streamer. Para lanzarlo correctamente, ejecutaremos:
cd /usr/src/mjpg-streamer/mjpg-streamer/
/mjpg_streamer -i "/usr/src/mjpg-streamer/mjpg-streamer/input_file.so -f /tmp/stream/" -o "/usr/src/mjpg-streamer/mjpg-streamer/output_http.so -w /usr/src/mjpg-streamer/mjpg-streamer/www/"
Creo que no necesita más explicaciones. Ahora desde un navegador (que puede ser el del Android) vamos a http://ip_del_raspberry:8080 y ahí veremos una web con varios ejemplos, vamos al menú de la izquierda y seleccionamos stream, que es el más compatible. Puedes directamente ir a http://ip_del_raspberry:8080/stream_simple.html que de hecho es la url que tendrás que configurar en ZoneMinder o cualquier otro.

Resultados

En la parte de calidad, es perfecto, 1080p, ahí no hay quejas. La tasa de refresco es algo baja, unos 2 FPS, pero aún así es mayor que las cámaras de seguridad convencionales.
La mejor parte es sin duda la carga de micro, que no llega ni al 2%:
Lo siguiente es combinar la raspicam con dos servos para hacer una torreta de vigilancia e integrarla con OpenCV para detectar movimientos, gestos, caras y personas. Y posiblemente le ponga un arma para matar zombies.

Streaming de video desde RaspberryPi (parte 3)

... probando 'motion' ...

Bueno, aquí seguimos. Me está empezando a mosquear este tema y en mi mente tengo 3 proyectos que usan esto, así que tengo que ponerlo en marcha sí o sí. Ahora voy a probar con 'motion'. Es el típico software de cámaras de seguridad de Linux, lleva años y años en los repositorios. Herramientas más complejas de videovigilancia, como Zoneminder, lo usan para hacer la captura básica. No quiero adelantarme a las pruebas, me temo que voy a tener el mismo resultado que en la parte 1. Al lío.

La instalación de 'motion' no puede ser más fácil:
apt-get update
apt-get install motion
ahora lo podemos poner en marcha ejecutando:
motion
o bien como demonio:
/etc/init.d/motion start
Primero diré que hay miles de configuraciones posibles, sólo hay que buscar un poco para darnos cuenta de cuantas cosas podemos hacer con 'motion', pero no nos sirve como streamind desde el RaspberryPi. El resultado lo vemos en http://ip_del_raspberrypi:8081
Como me temía el resultado es el mismo que en la parte 1, así que dejaremos 'motion' para lo que se inventó. En otro momento retomaré este programa.
Estoy perdiendo la esperanza de encontrar algo decente :'(

Streaming de video desde RaspberryPi (parte 2)

siguen las pruebas

Hola de nuevo, sigo con las pruebas de streaming de vídeo desde RaspberryPi. Si haces una búsqueda en Google, verás que hay cientos de webs, foros y blogs sobre este tema "how to streaming webcam from RaspberryPi". Tras leer unos cuantos ... la verdad es que no me queda nada claro. Funcionar, funcionan todos pero ... ¿cual es la mejor opción? A continuación mis pruebas con FFSERVER/FFMPEG

En este post, comentaba lo fácil y los "aceptables" resultados de mjpg-streamer. Ahora voy a probar FFserver, es algo más complejo y necesita más tiempo. Se compone de dos partes:

  1. FFserver, que es el servidor streaming en si mismo, es donde configuraremos usuarios y claves, puertos, ips permitidas ...
  2. FFmpeg, que lo hemos usado en otras ocasiones, y ahora su función es capturar las imágenes y ajustarles el formato y demás parámetros.
Para asegurarnos de que tenemos la última versión, vamos a hacer una compilación, voy a seguir las instrucciones de esta web:

  1. Añadimos a /etc/apt/sources.list: 
    1. deb-src http://www.deb-multimedia.org sid main
    2. deb http://www.deb-multimedia.org wheezy main non-free
  2. Recargamos: apt-get update
  3. Instalamos: apt-get install deb-multimedia-keyring
  4. De nuevo en el archivo sources.list eliminamos la línea:
    1. deb http://www.deb-multimedia.org wheezy main non-fre
  5. Cambiamos de directorio: cd /usr/src/
  6. Bajamos las fuentes con: apt-get source ffmpeg-dmo
  7. cd ffmeg-dmo-1.0.1 (ojo!)
  8. ./configure && make && make install
al ejecutar "make" se ha quedado compilando durante tres horas, así que paciencia. Editamos/creamos el archivo /etc/ffserver.conf
Port 88
BindAddress 0.0.0.0
MaxClients 1
MaxBandwidth 5000
NoDaemon
<Feed webcam.ffm>
file /tmp/webcam.ffm
FileMaxSize 10M
</Feed>

<Stream webcam.mjpeg>
Feed webcam.ffm
Format mjpeg
VideoSize 640x480
VideoFrameRate 5
VideoBitRate 1000
VideoQMin 1
VideoQMax 10
</Stream>
y ahora lanzamos ffserver:
ffserver -f /etc/ffserver.conf
si no devuelve ningún fallo, es que esta perfecto, como debe ser. Ahora conectamos la webcam, nos aseguramos que el sistema la reconoce (mira aquí) y empezamos a capturar con:
ffmpeg -v verbose -r 5 -s 640x480 -f v4l2 -an -i /dev/video0 http://localhost:88/webcam.ffm
lo primero que quiero ver, es la carga del micro, con un top:

bueno, sigue cargando la CPU, pero en este caso ronda el 50%, lo marcaremos como "aceptable". Ahora veamos la calidad.
Primero vamos a usar VLC, pulsamos "ctrl+n" y le indicamos:
http://ip_del_raspberry:88/webcam.mjpeg
Y aquí tenemos dos problemas, la calidad y el retraso. La calidad cae bastante y el retraso ronda los 5 segundos, así que no me sirve. Pero os dejo este post, porque seguro que a alguien le viene muy bien, ya que como comento, la carga del micro ronda el 50%.

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.