Transmisión de video en vivo en el servidor (PC) desde imágenes enviadas por un robot a través de UDP

Hmm Encontré esto que parece prometedor:

http://sourceforge.net/projects/mjpg-streamer/


De acuerdo. Trataré de explicar lo que estoy tratando de hacer claramente y con mucho detalle.

Tengo un pequeño robot humanoide con cámara y wifi ( este es el robot ). La tasa de transferencia promedio de wifi del stick wifi del robot es de 1769KB / s. El robot tiene una CPU de 500Mhz y 256 MB de RAM, por lo que no es suficiente para realizar ningún cálculo serio (además, ya hay un par de módulos que se ejecutan en el robot para movimiento, visión, sonar, voz, etc.).

Tengo una PC desde la que controlo el robot. Estoy tratando de que el robot camine por la habitación y vea un video en vivo de lo que el robot ve en la PC.

Lo que ya tengo trabajando. El robot está caminando como quiero que haga y tomando imágenes con la cámara. Las imágenes se envían a través del protocolo UDP a la PC donde las estoy recibiendo (lo he verificado guardando las imágenes entrantes en el disco).

La cámara devuelve imágenes que son 640 x 480 px en el espacio de color YUV442. Estoy enviando las imágenes con compresión con pérdida (JPEG) porque estoy tratando de obtener el mejor FPS posible en la PC. Estoy haciendo la compresión a JPEG en el robot con la biblioteca PIL.

Mis preguntas:

  1. ¿Podría alguien darme algunas ideas sobre cómo convertir las imágenes JPEG entrantes a una transmisión de video en vivo? Entiendo que necesitaré un codificador de video para eso. ¿Qué codificador de vídeo me recomiendan? FFMPEG o algo más? Soy muy nuevo en la transmisión de video, así que quiero saber qué es lo mejor para esta tarea. Preferiría usar Python para escribir esto, así que preferiría algún codificador de video o biblioteca que tenga la API de Python. Pero supongo que si la biblioteca tiene una buena API de línea de comandos, no tiene que estar en Python.

  2. ¿Cuál es el mejor FPS que podría obtener de esto? Dada la tasa de transferencia de wifi promedio de 1769KB / s y las dimensiones de las imágenes? ¿Debo usar una compresión diferente a JPEG?

  3. Estaré encantado de ver cualquier ejemplo de código. Los enlaces a los artículos que explican cómo hacer esto también estarían bien.

Algunos ejemplos de código. Aquí es cómo envío imágenes JPEG del robot a la PC (fragmento simplificado acortado). Esto se ejecuta en el robot:

# lots of code here UDPSock = socket(AF_INET,SOCK_DGRAM) while 1: image = camProxy.getImageLocal(nameId) size = (image[0], image[1]) data = image[6] im = Image.fromstring("YCbCr", size, data) s = StringIO.StringIO() im.save(s, "JPEG") UDPSock.sendto(s.getvalue(), addr) camProxy.releaseImage(nameId) UDPSock.close() # lots of code here 

Aquí es cómo estoy recibiendo las imágenes en la PC. Esto se ejecuta en la PC:

  # lots of code here UDPSock = socket(AF_INET,SOCK_DGRAM) UDPSock.bind(addr) while 1: data, addr = UDPSock.recvfrom(buf) # here I need to create a stream from the data # which contains JPEG image UDPSock.close() # lots of code here 

Revisando tu primera pregunta. Aunque la solución aquí utiliza un conjunto de imágenes sin transmisión. Podría ayudar. El ejemplo usa pyMedia.

Algunos a lo largo de las líneas de lo que quieres.

Si necesitas editar un flujo binario:

Pruebe pyffmpeg y pruebe cada códec disponible para obtener el mejor rendimiento. Probablemente necesite un códec muy liviano como Smoke o un perfil bajo H263 o x264, y probablemente necesite bajar la resolución a 320×240.

Tiene un intercambio entre la latencia de la encoding y deencoding de video y el ancho de banda utilizado, puede que se reduzca a 160×120 con paquetes sin procesar para un análisis rápido de la escena y que solo transmita periódicamente un cuadro completo. También puede mezclar una fuente de actualización alta, baja latencia, baja resolución, alta con una alimentación de actualización alta, alta latencia, alta compresión, comprimida.