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:
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.
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?
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:
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
@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? –
@Brad Ceci est un exemple de sortie brute de la caméra sans aucune compression/changement par moi: http://richardknop.com/log.txt –