2010-10-27 27 views
9

Hmm. J'ai trouvé ce qui semble prometteur:Flux vidéo en direct sur le serveur (PC) à partir d'images envoyées par le robot via UDP

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


Ok. Je vais essayer d'expliquer clairement ce que j'essaie de faire. J'ai un petit robot humanoïde avec une caméra et une clé wifi (this is the robot). Le taux de transfert wifi moyen du bâton wifi du robot est de 1769KB/s. Le robot a 500Mhz CPU et 256MB RAM donc il ne suffit pas pour des calculs sérieux (de plus il y a déjà quelques modules fonctionnant sur le robot pour le mouvement, la vision, le sonar, la parole, etc.).

J'ai un PC à partir duquel je contrôle le robot. J'essaie de faire marcher le robot dans la pièce et de voir une vidéo en direct de ce que le robot voit dans le PC.

Ce que j'ai déjà travaillé. Le robot marche comme je le veux et prend des photos avec l'appareil photo. Les images sont envoyées via le protocole UDP au PC où je les reçois (j'ai vérifié cela en sauvegardant les images entrantes sur le disque).

L'appareil photo renvoie des images de 640 x 480 px dans l'espace colorimétrique YUV442. J'envoie les images avec compression avec perte (JPEG) parce que j'essaye d'obtenir le meilleur FPS possible sur le PC. Je fais la compression en JPEG sur le robot avec la bibliothèque PIL.

Mes questions:

  1. Quelqu'un pourrait-il s'il vous plaît me donner quelques idées sur la façon de convertir les images JPEG entrants vers un flux vidéo en direct? Je comprends que j'aurai besoin d'un encodeur vidéo pour ça. Quel codeur vidéo recommandez-vous? FFMPEG ou autre chose? Je suis très novice en matière de streaming vidéo, je veux donc savoir ce qui est le mieux pour cette tâche. Je préférerais utiliser Python pour écrire ceci, donc je préférerais un encodeur vidéo ou une bibliothèque avec API Python. Mais je suppose que si la bibliothèque a une bonne API de ligne de commande, elle ne doit pas forcément être en Python.

  2. Quel est le meilleur FPS que je pourrais en tirer? Compte tenu du taux de transfert moyen de 1769 Ko/s et des dimensions des images? Dois-je utiliser une compression différente de celle du format JPEG?

  3. Je serai heureux de voir des exemples de code. Des liens vers des articles expliquant comment faire cela seraient bien aussi.

Certains échantillons de code. Voici comment j'envoie des images JPEG du robot au PC (extrait simplifié raccourci). Cela fonctionne sur le 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 

Voici comment je reçois les images sur le PC. Cela fonctionne sur le PC:

+0

La caméra elle-même ne renvoie pas JPEG, il y a un flux vidéo dans certains codecs déjà codés. Il doit y avoir un autre code qui tire une seule image de ce flux, oui? Si oui, alors pourriez-vous vous concentrer sur l'obtention du flux brut de la caméra et l'envoi de cela? Je suppose que vous aurez plus que suffisamment de bande passante. – Brad

+0

@Brad La caméra renvoie des images binaires brutes sans aucune compression. Si je les convertis en JPEG, ils sont beaucoup plus petits. Cela économise de la bande passante, non? –

+0

@Brad Ceci est un exemple de sortie brute de la caméra sans aucune compression/changement par moi: http://richardknop.com/log.txt –

Répondre

1

Vérification de votre première question. Bien que la solution utilise ici un ensemble d'images non-streaming. Cela pourrait aider. L'exemple utilise pyMedia.

Certains le long des lignes de ce que vous voulez.

Si vous avez besoin d'éditer un flux binaire:

+0

La dernière version de pymedia date de 2006 et il semble qu'elle n'ait pas été maintenue depuis des années. Je resterais loin de ça. Je vais jeter un oeil à d'autres liens. –

1

Essayez pyffmpeg et tester chaque codec disponible pour les meilleures performances. Vous avez probablement besoin d'un codec très léger comme Smoke ou H263 ou x264, et vous aurez probablement besoin de laisser tomber la résolution à 320x240. Vous avez un compromis entre la latence de l'encodage vidéo et du décodage et la bande passante utilisée, vous pourriez trouver tomber à 160x120 avec des paquets bruts pour une analyse rapide de la scène et transmettre seulement une image complète périodiquement. Vous pouvez également mélanger un flux de mise à jour brut, à faible latence, à faible résolution et à haute mise à jour avec un flux de mise à jour à haute compression, haute latence, haute résolution et faible mise à jour.