Transmissão de vídeo ao vivo no servidor (PC) a partir de imagens enviadas pelo robô através do UDP

Hmm. Achei isso que parece promissor:

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

Está bem. Vou tentar explicar o que estou tentando fazer claramente e com muitos detalhes.

Eu tenho um pequeno robô humanóide com câmera e wifi stick (este é o robô) A taxa média de transferência wifi do robô é 1769KB / s. O robô possui 500Mhz de CPU e 256MB de RAM, portanto não é suficiente para cálculos sérios (além disso, já existem dois módulos em execução no robô para movimento, visão, sonar, fala etc.).

Eu tenho um PC no qual controle o robô. Estou tentando fazer o robô andar pela sala e ver um vídeo ao vivo do que o robô vê no PC.

O que eu já tenho trabalhando. O robô está andando como eu quero e tirando fotos com a câmera. As imagens estão sendo enviadas através do protocolo UDP para o PC onde as estou recebendo (verifiquei isso salvando as imagens recebidas no disco).

A câmera retorna imagens de 640 x 480 px no espaço de cores YUV442. Estou enviando as imagens com compressão com perda (JPEG) porque estou tentando obter o melhor FPS possível no PC. Estou fazendo a compactação para JPEG no robô com a biblioteca PIL.

Minhas perguntas:

Alguém poderia me dar algumas idéias sobre como converter as imagens JPEG recebidas em um fluxo de vídeo ao vivo? Entendo que vou precisar de um codificador de vídeo para isso. Qual codificador de vídeo você recomenda? FFMPEG ou algo mais? Eu sou muito novo no streaming de vídeo, por isso quero saber o que é melhor para esta tarefa. Eu preferiria usar o Python para escrever isso, então eu preferiria algum codificador de vídeo ou biblioteca que possua API do Python. Mas acho que se a biblioteca tem uma boa API de linha de comando, ela não precisa estar em Python.

Qual o melhor FPS que eu consegui com isso? Dada a taxa média de transferência de 1769KB / s de wifi e as dimensões das imagens? Devo usar compactação diferente do JPEG?

Ficarei feliz em ver exemplos de código. Links para artigos explicando como fazer isso também seriam bons.

Alguns exemplos de código. Aqui está como estou enviando imagens JPEG do robô para o PC (trecho simplificado reduzido). Isso é executado no robô:

# 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

Aqui está como estou recebendo as imagens no PC. Isso é executado no 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

questionAnswers(2)

yourAnswerToTheQuestion