Trasteando con la Raspberry Pi - Video streaming básico

Al ir a  montar un robot con cámaras, una de las cosas que quiero es ver las imágenes de la cámara del robot mientras estoy sentado en el salón con el portátil.

En las entradas anteriores se puede ver que ya esta resuelta la captura de imagen de las cámaras y el envió de datos por udp ... Tener envió de vídeo es cuestión de juntar esas dos piezas.

Una pequeña limitación del udp es que los paquetes son entidades individuales y el máximo tamaño de paquete son 64K. Así que cuando se quieren mandar más datos que eso, es necesario comprimir los datos o mandar varios paquetes y verificar -a mano- que todos llegan para juntaros de nuevo.

La imágenes de las cámaras son mayores de 64K, de modo que es necesario hacer algo con ellas para mandarlas.

La primera solución que he probado ha sido capturar imágenes a media resolución -320x240- y comprimirlas a jpg, de ese modo caben en un único paquete udp. Aquí esta el cómo lo he hecho:
y en el otro lado...

Con este montaje alcanzo unas 6.5 imágenes por segundo enviadas por a RPi -y recibidas en el portátil- que no está mal y permite supervisar la actividad del robot, pero a coste de que la RPi esté al 98% de uso todo el rato.

Después de esta prueba, me quedó la duda de ver si merece la pena el comprimir la imagen frente al mandar varios paquetes de datos, porque la RPi tiene poco procesador y era posible que costase menos hacer varios envios que codificar la imagen.

La prueba no es más que una variación del código anterior añadiendo en el primer byte del mensaje el indice del envío y que se necesitan 4 envíos por cada imagen.


El resultado enviando la imagen a trozos es de 8.4 imágenes por segundo, casi 2 más que codificando la imagen, de modo que -al menos para esa resolución- merece más la pena enviar 4 veces más datos que codificarlos -y tiene la pequeña ventaja de que la imagen recibida no tiene las perdidas que se originan con la compresión-  

No hay comentarios: