2010-10-27 6 views
9

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

:

  1. 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.

  2. 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?

  3. 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 
+0

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

+0

@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? –

+0

@Brad Dies ist ein Beispiel rohe Ausgabe von der Kamera ohne Komprimierung/Änderung von mir: http://richardknop.com/log.txt –

Antwort

1

Überprüfen Sie Ihre erste Frage. Obwohl die Lösung hier eine nicht-streaming Gruppe von Bildern verwendet. Es könnte helfen. In diesem Beispiel wird pyMedia verwendet.

Einige entlang der Linien von dem, was Sie wollen.

Wenn Sie eine Notwendigkeit, einen binären Strom zu bearbeiten: für die beste Leistung

+0

Die neueste Veröffentlichung der pymedia war 2006 und es sieht so aus, als ob sie seit Jahren nicht mehr gepflegt wird. Ich würde mich davon fernhalten. Ich werde mir andere Links ansehen. –

1

Versuchen pyffmpeg und testen jeden verfügbaren Codec. Sie benötigen wahrscheinlich einen sehr leichten Codec wie Smoke oder Low Profile H263 oder X264, und Sie müssen wahrscheinlich die Auflösung auf 320x240 fallen lassen.

Sie haben eine Abwägung zwischen der Latenz der Videocodierung und -decodierung und der verwendeten Bandbreite. Sie können mit rohen Paketen auf 160x120 für eine schnelle Szenenanalyse herunterfallen und nur periodisch einen vollen Frame übertragen. Sie können auch einen rohen Feed mit geringer Latenz, niedriger Auflösung und hohem Aktualisierungsaufwand mit einem hochkomprimierten Feed mit hoher Latenz, hoher Auflösung und geringer Aktualisierungsrate kombinieren.

Verwandte Themen