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:
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.
¿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?
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
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
@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? –
@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 –