wenn es dich interessiert würde dir vorschlagen mal unserer Indiegogo Kampagne - insbesondere die Update section - anzugucken. Wir gehen auf praktisch alle von dir genannten Punkt ein.
Hallo aero,
ich habe mir die Seite schon vor ein paar Tagen mal angeschaut und habe es gerade nochmal getan. Ihr habt ja folgende Blöcke die das Low Latency Thema behandeln:
SkyDroneIndiegogo hat gesagt.:
Analog links often have a low latency. Digital solutions usually need buffering or use inter-frame compression algorithms (H.264 / MPEG4) that are not built for low latency video or unreliable connections. Furthermore they are transferred on network protocols that are not suitable for real time video transfer (e.g. TCP).
sowie weiter unten in der Geeky Stuff Sektion das ihr halt UDP verwendet und versucht ein NAT-Traversal zu machen.
Capture
Weiter oben finde ich die Angabe 1920x1080@30fps, die 1920x1080 sind für mich nicht interessant, jedoch die 30fps. Dadurch hat man ja schonmal mind.
33ms Delay von dem reinen Aufnehmen der Bilder! Dazu kommt der Encoding-Aufwand.
Encoding
Laut eurer Aussage ist ja H.264 nicht für Low-Latency Video geeignet. Ich frag mich halt wie ihr es dann macht, es gibt natürlich noch hunderte weitere Videocodecs, aber die funktionieren entweder ähnlich wie h264 (mit Keyframes und Bewegungsvektoren) oder codieren halt Einzelbilder. Letzteres braucht sehr viel Bandbreite, was wieder zu höherere Latenz führt! Nehmen wir mal an das Encoding dauert
5ms pro Frame, wobei das bei 1920x1080 auf der wahrscheinlich zur Verfügung stehenden Hardware schon sehr optimistisch ist! Ich habe mal Millionen an JPEGs umrechnen müssen und dazu optimierten wir den Encoder und ließen das auf 2 Servern mit 16 Core Opterons laufen. Das hat deutlich länger wie 5ms pro Bild mit HD-Auflösung gebraucht und daran war nicht die I/O Schuld.
Transmission Delay
Ja hier ist die meisten Spekulation nötig, da es von sooo vielen Faktoren abhängt. Aber prinzipiell wird einem bei 3G vermtl. allein schon das Transmission-Delay zum Verhängnis, was natürlich von der Videostreambandbreite abhängt. gehen wir mal von 5MBit aus, was schon sehr optimistisch ist. Dann wäre jeder Frame bei 30fps 5/30 = 1,6Mbit groß. Sprich 200kB. Sprich die reine Übertragung von Anfang bis Ende eines Bildes braucht bei 5Mbit auf genau 1/30 sek also wieder
33ms. Falls man eine kleine Bandbreite wählt kann man das mit dem HD auch gleich sein lassen!
Das selbe trifft natürlich bei jedem Router zwischen Sender und Empfänger zu, die Paket müssen erst komplett empfangen werden, dann reingeschaut werden wo sie hinsollen hinsoll und sie dann weitergesendet werden. Da das übertragen Zeit braucht, je nach Bandbreite der Anbindung kommt hier je Router einmal die Übertragungszeit die bei der Bandbreite mit der der Router angebunden ist benötigt wird. (
66ms+ da mind 1 Router und der Empfänger auch das Delay hat)
Propagation, Queueing und Processing Delay
Alle eher zu vernachlässigen bis auf das Queueing Delay, das hängt von der Netzauslastung ab, hier gilt First Come First Serve im Normalfall.
Hier mal ein Ping über 3G an den 1. Knoten im Netz direkt nach der HSDPA+ Schnittstelle (O2 in Stuttgart 13 Uhr in einem Wohngebiet):
Code:
PING 74.125.18.22 (74.125.18.22) 56(84) bytes of data.
64 bytes from 74.125.18.22: icmp_seq=1 ttl=43 time=390 ms
64 bytes from 74.125.18.22: icmp_seq=2 ttl=43 time=360 ms
64 bytes from 74.125.18.22: icmp_seq=3 ttl=43 time=370 ms
64 bytes from 74.125.18.22: icmp_seq=4 ttl=43 time=349 ms
64 bytes from 74.125.18.22: icmp_seq=5 ttl=43 time=448 ms
64 bytes from 74.125.18.22: icmp_seq=6 ttl=43 time=628 ms
64 bytes from 74.125.18.22: icmp_seq=7 ttl=43 time=447 ms
64 bytes from 74.125.18.22: icmp_seq=8 ttl=43 time=347 ms
64 bytes from 74.125.18.22: icmp_seq=9 ttl=43 time=366 ms
--- 74.125.18.22 ping statistics ---
9 packets transmitted, 9 received, 0% packet loss, time 8005ms
rtt min/avg/max/mdev = 347.107/411.875/628.022/84.584 ms
Hier handelt es sich um die RTT also hin und zurück. Das ist theoretisch bei Sender und Empfänger ja auch nötig, Vom Sender zum Netz und vom Netz zum Empfänger. Da das Video stottern würde wenn man jeden Frame direkt darstellt wenn er ankommt, muss man hier die langsamste Zeit nehmen! Sprich 628ms!
Ehrlichgesagt habe ich schon bessere Pingzeiten per 3G gesehen (um die 150ms) jedoch ist das z.B: die aktuelle Realität eines deutschen Mobilfunknetztes!
Nehmen wir also mal als best case
150ms an! Was NICHT der Realität entspricht! Das Transmisison Delay ist hier zu vernachlässigen, da das Ping Paket nur einige Byte groß ist.
TCP / UDP
Ihr schreibt das ihr NAT-Traversal einsetzt. Wenn das funktioniert ok, dann die Delays wie oben. In deutschen Mobilfunknetzen wird hingegen meist Carrier Grade NAT eingesetzt was kein NAT-Traversal erlaubt b.z.w. die Verbindungen andauernd wieder killt nach ein paar Sekunden. Das machen die, dass man kein SIP übers Mobilfunknetz verwendet. Ich weiß nicht wie es bei euch in der Schweiz ist, hier jedenfalls ist Device2Device über UDP und auch über TCP nahezu nicht möglich. Also würde eure TCP Lösung mit Proxyserver verwendet. Und da kommen wir in teufels Küche! Weil 2x TCP (hin und zurück) und TCP wie der Name schon sagt ist ein "Trusted Communication Protokoll" sprich da werden ACK Pakete verschickt und es finde Retransmissions statt. Falls Retransmissions stattfinden sind Delays von über 2-5 Sekunden keine Seltenheit mehr!
Decoding / Darstellung
Auf Clientseite muss decoded werden, nehmen wir mal
1ms an da man sehr starke Hardware hat sowie nochmal
20ms um das Bild vom Framebuffer an die Anzeige zu schicken. je nach Anzeige braucht es dann nochmal
20ms bis die Pixel physikalisch sich ändern / das Bild vom Anzeigecontroller wirklich in elektrische Signal umgewandelt wird!
Also best case: 33ms capture + 5ms encoding + 33ms transmission sendend + 66ms tranmission empfangend und netz + 150 ms allgemeines Netz delay + 1ms decoding + 20ms Framebuffer zu Display + 20ms Darstellung.
komm ich auf.
Best case (Beispiel oben):
328ms
Mit gemessenem Netzwerk Delay:
806ms
Wenn dann noch Proxyserver u.s.w dazukommt, kann man das Video vermtl. schneller sehen wenn man es von der SD-Karte anschaut, die man aus dem bereits gelandeten Modell entnimmt!
Ein gutes Gefühl dafür wie schlecht Video über Mobilfunknetz funktioniert kann man auch ganz einfach selbst haben, indem man einfach mal so ne Videochatsession zwischen zwei Geräten die mit 3G verbunden sind durchführt. Bei Android z.B. Hangout und bei Iphone Facetime (geht das überhaupt über 3G?).
Die meisten Smartphones haben sogar in Hardware gegossene Video-Encoder drinne zumindest viele Android. trozdem ist das mal absolut nicht zu benutzen über Mobilfunk! Und das Zeug ist alles auf Low-Latency optimiert!
Probiert es einfach selbst aus! Über W-Lan geht das 1A mit niedriger Latenz!
Ich finde euer Projekt zwar cool und würde mir auch wünschen das sowas tut, aber es ist schlicht und ergreifend unrealistisch mit dem heutigen Stand der Technik da ein sicheres, schnelles und verwendbares System auf den Markt zu bringen in meinen Augen. Aber das ganze ließe sich ja später evtl. mal super auf andere Übertragungswege ausbauen!