Hmm. Ich fand dies die versprechend erscheint:Live-Video-Stream auf dem Server (PC) von Bildern gesendet von Roboter durch UDP
http://sourceforge.net/projects/mjpg-streamer/
Ok. Ich werde versuchen zu erklären, was ich versuche, klar und detailliert zu machen.
Ich habe einen kleinen humanoiden Roboter mit Kamera und Wifi Stick (this is the robot). Die WLAN-Übertragungsgeschwindigkeit des Roboters beträgt durchschnittlich 1769 KB/s. Der Roboter hat 500Mhz CPU und 256MB RAM, so dass es für ernsthafte Berechnungen nicht ausreicht (außerdem gibt es bereits paar Module, die auf dem Roboter für Bewegung, Vision, Sonar, Sprache usw. laufen).
Ich habe einen PC, von dem ich den Roboter steuere. Ich versuche, den Roboter durch den Raum laufen zu lassen und ein Live-Stream-Video von dem zu sehen, was der Roboter auf dem PC sieht.
Was ich bereits arbeite. Der Roboter läuft, wie ich es möchte und macht Bilder mit der Kamera. Die Bilder werden über das UDP-Protokoll an den PC gesendet, auf dem ich sie erhalte (ich habe dies verifiziert, indem ich die eingehenden Bilder auf dem Datenträger gespeichert habe).
Die Kamera gibt im YUV442-Farbraum Bilder zurück, die 640 x 480 Pixel groß sind. Ich sende die Bilder mit verlustbehafteter Komprimierung (JPEG), weil ich versuche, den bestmöglichen FPS auf dem PC zu bekommen. Ich mache die Kompression auf JPEG auf dem Roboter mit PIL-Bibliothek. Meine Fragen
:
Könnte jemand bitte geben Sie mir einige Ideen, wie die eingehenden JPEG-Bilder zu einem Live-Video-Stream zu konvertieren? Ich verstehe, dass ich dafür einen Video-Encoder benötige. Welchen Video-Encoder empfehlen Sie? FFMPEG oder etwas anderes? Ich bin sehr neu im Video-Streaming, also möchte ich wissen, was für diese Aufgabe am besten ist. Ich würde es vorziehen, Python zu verwenden, um dies zu schreiben, also würde ich etwas Video-Encoder oder Bibliothek bevorzugen, die Python-API hat. Aber ich denke, wenn die Bibliothek eine gute Befehlszeilen-API hat, muss sie nicht in Python sein.
Was ist der beste FPS, den ich daraus bekommen könnte? Angesichts der 1769KB/s durchschnittliche WLAN-Übertragungsrate und die Abmessungen der Bilder? Sollte ich eine andere Komprimierung als JPEG verwenden?
Ich werde mich freuen, irgendwelche Codebeispiele zu sehen. Links zu Artikeln, die erklären, wie das geht, wäre auch in Ordnung.
Einige Codebeispiele. So sende ich JPEG-Bilder vom Roboter zum PC (verkürztes Schnipsel). Dies läuft auf dem Roboter:
# 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
Hier ist, wie ich die Bilder auf dem PC empfange. Dies läuft auf dem 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
Die Kamera selbst gibt kein JPEG zurück, da ist ein Videostream in irgendeinem Codec dort schon kodiert. Es muss einen anderen Code geben, der einen einzelnen Frame aus diesem Stream zieht, ja? Wenn ja, könntest du dich darauf konzentrieren, den Rohdatenstrom von der Kamera zu bekommen und ihn zu senden? Ich vermute, du wirst mehr als genug Bandbreite haben. – Brad
@Brad Die Kamera gibt unverarbeitete Binärbilder ohne Komprimierung zurück. Wenn ich sie in JPEG umwandle, sind sie viel kleiner. Das spart Bandbreite, oder? –
@Brad Dies ist ein Beispiel rohe Ausgabe von der Kamera ohne Komprimierung/Änderung von mir: http://richardknop.com/log.txt –