2010-10-27 11 views
9

Hmm. He encontrado este que parece prometedora:Transmisión de video en vivo en el servidor (PC) a partir de imágenes enviadas por robot a través de UDP

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


Ok. Trataré de explicar lo que trato de hacer de forma clara y detallada.

Tengo un pequeño robot humanoide con cámara y wifi stick (this is the robot). La tasa promedio de transferencia wifi del stick wifi del robot es de 1769 KB/s. El robot tiene una CPU de 500Mhz y 256MB de RAM, por lo que no es suficiente para cálculos serios (además, ya hay dos módulos funcionando en el robot para movimiento, visión, sonar, voz, etc.).

I tienen un PC desde el que puedo controlar el robot. Intento que el robot camine por la sala 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 toma 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 vuelve imágenes que son de 640 x 480 píxeles en YUV442 espacio de color. 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 por favor me dan algunas ideas sobre cómo convertir las imágenes JPEG entrantes a un vídeo en directo? Entiendo que necesitaré un codificador de video para eso. ¿Qué codificador de video recomiendas? 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 por qué estar en Python.

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

  3. estaré feliz de ver algún ejemplo de código. Los enlaces a artículos que explican cómo hacer esto estarían bien, también.

Algunos ejemplos de código. Así es como estoy enviando imágenes JPEG desde el robot a la PC (fragmento simplificado abreviado). 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 

Así es como 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 
+0

La cámara no está devolviendo JPEG, hay una secuencia de video codificada en algún códec. Debe haber otro código que extraiga un solo fotograma de esa transmisión, ¿sí? Si es así, ¿podría concentrarse en obtener la transmisión sin procesar de la cámara y enviarla? Sospecho que tendrá ancho de banda más que suficiente. – Brad

+0

@Brad La cámara devuelve imágenes binarias sin compresión. Si los convierto a JPEG, son mucho más pequeños. Eso ahorra ancho de banda, ¿no? –

+0

@Brad Este es un ejemplo de salida en bruto de la cámara sin ninguna compresión/cambio por mí: http://richardknop.com/log.txt –

Respuesta

1

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

Algunos lo largo de las líneas de lo que desea.

Si usted tiene una necesidad de editar una secuencia binaria:

+0

La última versión de pymedia fue en 2006 y parece que no se ha mantenido durante años. Me mantendría alejado de eso. Echaré un vistazo a otros enlaces. –

1

Trate pyffmpeg y probar cada codec disponible para el mejor rendimiento. Probablemente necesites un códec muy ligero como Smoke o H263 o x264 de bajo perfil, y probablemente necesites soltar la resolución a 320x240.

Tiene una compensación entre la latencia de la codificación de video y la decodificación y el ancho de banda utilizado, puede encontrar caer a 160x120 con paquetes sin formato para un análisis de escena rápido y solo transmitir periódicamente un fotograma completo. También puede mezclar una alimentación de actualización alta en crudo, de baja latencia, baja resolución y alta con una alta velocidad de compresión, alta latencia, alta resolución y baja actualización.

Cuestiones relacionadas