Funktionsweise:
Diese App funktioniert nicht nur wie ein Video Player,sie hat auch eine ganze Menge Extras .
1)Video: empfängt einen raw h.264 Stream auf UDP Port 5000 (oder TestFile), parst diesen in 'Nalu-Units', und- das ist das wichtigste- decodiert ihn mit kleinstmöglichster Latenz mithilfe Android's MediaCodec API in HW , und rendert den Stream
a) auf ein Android SurfaceView
b) auf ein Android TextureView
c) Side by Side als Textur mit OpenGL ES 2.0.
Und hier ist,wo das VR beginnt: Mit OpenGL und einer Cardboard-Style VideoBrille lässt sich Side by Side nicht nur ein
Stereoskopischer Effekt erzeugen, auch Head Tracking Real Time am Boden ,und sogar die Integration des FPV Videos in eine 3D-Welt, sind möglich.
Voraussetzung: ein Digitaler HD VideoLink, bspw. mit RPI und Wifibroadcast:
http://fpv-community.de/showthread....eo-Thread-zum-Raspberry-HD-Videolink-fon-Befi
Ein modernes Android-Smartphone mit midestens Full HD Resolution
Github Account: https://github.com/Consti10/myMediaCodecPlayer-for-FPV
Tutorial für FPV (beta)
1)Test,ob der VideoPlayer HW-Accelerated funktioniert:
Step1: Downloade das raw h.264 test file "rpi960mal810" von https://github.com/Consti10/myMedia...ree/master/DecoderTestApp-and test video clip und speichere es auf dem internen Speicher.
Step2: Settings->DecoderSettings -> Data Sorce: receive from raw h.264 file
FileName 1: rpi960mal810
ListPreference: select HW decoder
Step3: wähle eine der Activities. Wenn das Video in x-facher Geschwindigkeit läuft,dann passt alles.
Wenn nicht: multiThread on/off , und/oder SW Decoder wählen.
OPTION A:
Vorteile:schnell&easy, Nachteile: KEIN "wifibroadcast" ! ,sondern ein direkter wlan link - reicht nur für ~200m herumcruisen
Benötigt: rpi mit camera und wlan Stick,handy mit neuester app
Weg der Daten: Licht->rpi cam->rpi h.264 encoder->wlan(raw h.264 data byte-stream over udp)->handy->hw h.264 decoder des Handy's->Screen
Stepp 1) Herstellen der Verbindung Pi-Handy
Auf dem Handy einen wlan Hotspot starten,und den rpi mit dem Hotspot verbinden.
Tester rpi sollte nun bspw. google öffnen können
Stepp 2) Ip Adresse des Handy's finden & aufschreiben
Entweder findet man die ip des Handy's in den Einstellungen, oder man startet "TestActivity"; dort stehen die ip adressen des Handy's. Ich sage Adressen- das Handy kann mehrere ip's haben (bspw. 1 für das Heim-Wlan, 1 für den Hotspot), von denen nur 1 die gesuchte ist.
In der App muss man in diesem fall das richtige interface suchen; diese haben leider keine "gewohnten" trivialnamen.
Bei mir:"wlan0"= home wlan
"rmnet0"= wlan hotspot
"xxx"= usb hotspot
Zur not hilft jedoch google schnell weiter.
In meinem fall ist das Handy per wlan Hotspot mit dem pi verbunden; Ich schreibe mir also 10.69.47.45 als ip Adresse auf.
Test: auf dem pi sollte die ip mit "ping 10.69.47.45" ereichbar sein; Achtung: es sind alle ip's des Handy's "ping-bar",aber nur die vom richtigen Interface funktioniert später.
Achtung: erhöhte Latenz durch Eigenschaften der WIFI verbindung
Stepp 3) Camera starten & daten an's handy senden
Auf dem pi folgendes Kommando eingeben "raspivid -w 960 -h 810 -b 3000000 -fps 49 -t 0 -pf baseline -ih -g 49 -o - | socat -b 1024 - udp4-datagram:10.69.47.45:5000 ";
dabei nun natürlich anstatt 10.69.47.45 die aufgeschriebene ip verwenden.
Test: In "testActivity" sollte nun nicht mehr das toast "couldn't receive any bytes" erscheinen,sondern die empfangenen frames&bytes:
Wenn nicht: die pipeline nochmal überprüfen.
Stepp 4) Decodiertes video anzeigen:
Eine Anzeigeart auswählen & das video checken.
Wenn kein Video angezeigt wird: es kann bis zu 10 sec. dauern,bis der decoder initialisiert ist & ein key-frame empfangen hat.
Wenn der parameter -ih fehlt: die raspivid pipeline auf dem pi nach dem Player starten.
Wenn nicht: mal in den Einstellungen -> Latency file schauen, ob der decoder wirklich frames decodiert.
es kann jedoch auch sein,dass der decoder mit dem rpi cam byte-stream nicht kompatibel ist - dann mal im thread schreiben, ich versuche dann,eine Lösung zu finden.
OPTION B:
Vorteile:Reichweite,"wifibroadcast" übertragung
Nachteile: komplizierter
Benötigt: "normalen" tx und rx pi, Handy, app, USB kabel
Weg der Daten: Licht->rpi cam->rpi h.264 encoder->wifibroadcast tx-> air(wifibradcast packets)->wifibradcast rx->usb-kabel->handy-app->hw h.264 decoder des Handy's->Screen
Vorgehensweise: wie bei Option A); wir verbinden das Handy aber mit dem rx pi,und verändern die rx pipeline:
1)Für die,die keines von den "prebuild" images nehmen:
./rx -b 4 -r 2 -f 1024 wlan2 | socat -b 1024 - udp4-sendto:10.69.47.45:5000" ( parameter -b , -r ,und die ip müssen natürlich angepasst werden )
2)Für die mit den prebuild images:
ungefähr so: $WBC_PATH/rx -p $PORT -b $BLOCK_SIZE -r $FECS -f $PACKET_LENGTH $NICS | socat -b 1024 - udp4-sendto:192.168.0.104:5000;
die "raspivid pipeline" durch die "socat pipeline" ersetzen
Ich persönlich verbinde das Handy am liebsten per usb hotspot mit dem rx pi; wenn sich die channels nicht stören, ist jedoch auch eine wlan hotspot verbindung möglich & angenehm (fatshark like -kein kabel am boden )
----------------------------------------------------------------------------------------------------
Settings:
1)OpenGL Settings (Settings for playing video and OSD)
1.1)Overall
1.1.1)Video Format: wenn die Auflösung bspw. 800*600 beträgt,so ist das Format 800/600=1.333.
1.1.2)video Distance: Abstand Auge-Video Leinwand
1.1.3)interpupilarryDistance: Augenabstand für 3D
1.1.4)swapIntervallZero: improves lag
1.1.5)Extension: Experimental
1.1.6) Head Tracking on/off
1.1.7) OSD on/off
1.2))OSD specific settings: Achtung: noch in Entwicklung
1.2.1)model Distance: Abstand Virtual Kopter-Auge
2),3),4),... Ob man die jeweilige funktion vom OSD an/ausschalten möchte
2)Decoder Settings
1)Data Source: die app kann die raw h.264 streams entweder auf dem udp port 5000 empfangen,oder ein raw .h264 file(wie es die rpi cam erzeugt) parsen
Praktisch zum testen; man muss nur aufpassen,wenn die app ein File parst,wird der encoder so schnell wie möglich gefüttert, und es besteht
keine time-synchronisation
2)File Name 1: receiving data from file; das file muss auf demselben ort gespeichert sein,wo auch das "GroundRecording" file liegt;
3)Decoder MultiThread: empfohlen: an
4)Select your decoder: HW decoder unterscheiden sich sehr stark von Chipsatz zu Chipsatz. der SW decoder funktioniert auf allen Geräten,ist jedoch langsammer;
wenn der HW decoder nicht funktioniert,bitte im Thread schreiben
3)Ground recording Settings:
1)Ground Recording on/off. Kann bei langsammen Geräten Latenz erhöhen,muss aber nicht;
2)File Name 2: ground recording file
4)Debug Settings:
1)Latency: zeigt die messbare Latenz der app an; wie viele frames android buffert,ist schwer zu sagen, und hängt auch vom hersteller ab; mein huawei hat einen input lag von ~60ms (getestet,wer will kann mal die App OpenGLLagTest ausprobieren) ; angenommen der touchscreen hat 12ms verzögerung,dann buffert android wohl 3 frames (48ms); der Lag 'Info zu Pixel' ist dann "measured App latency+48ms)
2)UserDebug: disable for FPV flying !
3)DebugFile: klappt noch nicht ganz; Android Studio gibt deutlich mehr Informationen aus
-----------------------------------------------------------------------------------------------------
OSD: in Developement
FAQ:
1)warum kann ich nicht das wlan vom handy für wifibroadcast benutzen,und brauche den rx pi ?
-Android unterstützt keinen "Monitor mode" und auch wifibradcast hat noch niemand auf Android portiert; für die technisch versierten: Es geht schon,ist jedoch kompliziert; info's hier: https://befinitiv.wordpress.com/2015/04/18/porting-wifibroadcast-to-android/
2)wie hoch ist der Lag der App ?
Bei meinem Handy (Huawei ascend p7 , mali 450 mp gpu) gehen bei 49 fps von 130ms end-to-end latency etwa 60ms auf die app.
In den Einstellungen findet ihr ein "Latency file".
Der "overall measured lag of the app" sollte nicht höher als 20ms sein (bei mir: ~12ms); wenn er größer ist,dann Buffert der hw decoder vermutlich frames (ein feature von manchen herstellern,das für real-time streaming jedoch nur von Nachteil ist).
Achtung: Da das TestFile mit der max. Geschwindigkeit abgespielt wird,ist die "measured app Latency" nur beim Abspielen des udp Streams aussagekräftig.
Der restliche Lag (etwa 48 ms) entsteht durch "Android's SurfaceFlinger",welcher bis zu 3 "display-frames (16ms)" latency erzeugt.
Generell: Lag of App in ms=((3/OpenGlfps*1000)+measuredAppLatency);
Lag of Stream=EncoderLag+AppLag.
Die App ist schon so weit,wie es für einen "nicht-breadcom-hw-engineerer" geht, auf real-time optimiert. Und ich sage nicht ohne Stolz,dass ich mit dem "Software x264 encoder" und avconv auf meinem linux pc den Bildschirm bei 120fps unter 70ms auf mein Handy spiegeln kann - das ist mindestens genau so gut,wie die "GameStream" Angebote von nVidia oder steam ( https://youtu.be/a9-bdXUC0j0 ).
*UPDATE 29.03.2016: Setting swap intervall to zero reduces lag by 1 more frame on my device,and increases OpenGL fps*
3) Die usb Verbindung handy-rpi trennt sich nach kurzer Zeit:
Wenn das Handy angeschlossen wird,lädt der rpi es natürlich auf;
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=100244
Bei einem guten PowerSupply am rx Pi.
4) Warum ist die App nicht direkt eine "Cardboard-App" ?
Der "Disortion renderer" von Google Cardboard erzeugt noch einmal einen Lag von etwa 30ms, weshalb ich zwar Die Cardboard-API "HeadTracker" in meiner App benutze,den Stereoskopischen Effekt(leftEyeViewM,...) jedoch selber erzeuge.
Einziger Nachteil: Die VR brille sollte nicht zu sehr "verzerren".
Diese App funktioniert nicht nur wie ein Video Player,sie hat auch eine ganze Menge Extras .
1)Video: empfängt einen raw h.264 Stream auf UDP Port 5000 (oder TestFile), parst diesen in 'Nalu-Units', und- das ist das wichtigste- decodiert ihn mit kleinstmöglichster Latenz mithilfe Android's MediaCodec API in HW , und rendert den Stream
a) auf ein Android SurfaceView
b) auf ein Android TextureView
c) Side by Side als Textur mit OpenGL ES 2.0.
Und hier ist,wo das VR beginnt: Mit OpenGL und einer Cardboard-Style VideoBrille lässt sich Side by Side nicht nur ein
Stereoskopischer Effekt erzeugen, auch Head Tracking Real Time am Boden ,und sogar die Integration des FPV Videos in eine 3D-Welt, sind möglich.
Voraussetzung: ein Digitaler HD VideoLink, bspw. mit RPI und Wifibroadcast:
http://fpv-community.de/showthread....eo-Thread-zum-Raspberry-HD-Videolink-fon-Befi
Ein modernes Android-Smartphone mit midestens Full HD Resolution
Github Account: https://github.com/Consti10/myMediaCodecPlayer-for-FPV
Tutorial für FPV (beta)
1)Test,ob der VideoPlayer HW-Accelerated funktioniert:
Step1: Downloade das raw h.264 test file "rpi960mal810" von https://github.com/Consti10/myMedia...ree/master/DecoderTestApp-and test video clip und speichere es auf dem internen Speicher.
Step2: Settings->DecoderSettings -> Data Sorce: receive from raw h.264 file
FileName 1: rpi960mal810
ListPreference: select HW decoder
Step3: wähle eine der Activities. Wenn das Video in x-facher Geschwindigkeit läuft,dann passt alles.
Wenn nicht: multiThread on/off , und/oder SW Decoder wählen.
OPTION A:
Vorteile:schnell&easy, Nachteile: KEIN "wifibroadcast" ! ,sondern ein direkter wlan link - reicht nur für ~200m herumcruisen
Benötigt: rpi mit camera und wlan Stick,handy mit neuester app
Weg der Daten: Licht->rpi cam->rpi h.264 encoder->wlan(raw h.264 data byte-stream over udp)->handy->hw h.264 decoder des Handy's->Screen
Stepp 1) Herstellen der Verbindung Pi-Handy
Auf dem Handy einen wlan Hotspot starten,und den rpi mit dem Hotspot verbinden.
Tester rpi sollte nun bspw. google öffnen können
Stepp 2) Ip Adresse des Handy's finden & aufschreiben
Entweder findet man die ip des Handy's in den Einstellungen, oder man startet "TestActivity"; dort stehen die ip adressen des Handy's. Ich sage Adressen- das Handy kann mehrere ip's haben (bspw. 1 für das Heim-Wlan, 1 für den Hotspot), von denen nur 1 die gesuchte ist.
In der App muss man in diesem fall das richtige interface suchen; diese haben leider keine "gewohnten" trivialnamen.
Bei mir:"wlan0"= home wlan
"rmnet0"= wlan hotspot
"xxx"= usb hotspot
Zur not hilft jedoch google schnell weiter.
In meinem fall ist das Handy per wlan Hotspot mit dem pi verbunden; Ich schreibe mir also 10.69.47.45 als ip Adresse auf.
Test: auf dem pi sollte die ip mit "ping 10.69.47.45" ereichbar sein; Achtung: es sind alle ip's des Handy's "ping-bar",aber nur die vom richtigen Interface funktioniert später.
Achtung: erhöhte Latenz durch Eigenschaften der WIFI verbindung
Stepp 3) Camera starten & daten an's handy senden
Auf dem pi folgendes Kommando eingeben "raspivid -w 960 -h 810 -b 3000000 -fps 49 -t 0 -pf baseline -ih -g 49 -o - | socat -b 1024 - udp4-datagram:10.69.47.45:5000 ";
dabei nun natürlich anstatt 10.69.47.45 die aufgeschriebene ip verwenden.
Test: In "testActivity" sollte nun nicht mehr das toast "couldn't receive any bytes" erscheinen,sondern die empfangenen frames&bytes:
Wenn nicht: die pipeline nochmal überprüfen.
Stepp 4) Decodiertes video anzeigen:
Eine Anzeigeart auswählen & das video checken.
Wenn kein Video angezeigt wird: es kann bis zu 10 sec. dauern,bis der decoder initialisiert ist & ein key-frame empfangen hat.
Wenn der parameter -ih fehlt: die raspivid pipeline auf dem pi nach dem Player starten.
Wenn nicht: mal in den Einstellungen -> Latency file schauen, ob der decoder wirklich frames decodiert.
es kann jedoch auch sein,dass der decoder mit dem rpi cam byte-stream nicht kompatibel ist - dann mal im thread schreiben, ich versuche dann,eine Lösung zu finden.
OPTION B:
Vorteile:Reichweite,"wifibroadcast" übertragung
Nachteile: komplizierter
Benötigt: "normalen" tx und rx pi, Handy, app, USB kabel
Weg der Daten: Licht->rpi cam->rpi h.264 encoder->wifibroadcast tx-> air(wifibradcast packets)->wifibradcast rx->usb-kabel->handy-app->hw h.264 decoder des Handy's->Screen
Vorgehensweise: wie bei Option A); wir verbinden das Handy aber mit dem rx pi,und verändern die rx pipeline:
1)Für die,die keines von den "prebuild" images nehmen:
./rx -b 4 -r 2 -f 1024 wlan2 | socat -b 1024 - udp4-sendto:10.69.47.45:5000" ( parameter -b , -r ,und die ip müssen natürlich angepasst werden )
2)Für die mit den prebuild images:
ungefähr so: $WBC_PATH/rx -p $PORT -b $BLOCK_SIZE -r $FECS -f $PACKET_LENGTH $NICS | socat -b 1024 - udp4-sendto:192.168.0.104:5000;
die "raspivid pipeline" durch die "socat pipeline" ersetzen
Ich persönlich verbinde das Handy am liebsten per usb hotspot mit dem rx pi; wenn sich die channels nicht stören, ist jedoch auch eine wlan hotspot verbindung möglich & angenehm (fatshark like -kein kabel am boden )
----------------------------------------------------------------------------------------------------
Settings:
1)OpenGL Settings (Settings for playing video and OSD)
1.1)Overall
1.1.1)Video Format: wenn die Auflösung bspw. 800*600 beträgt,so ist das Format 800/600=1.333.
1.1.2)video Distance: Abstand Auge-Video Leinwand
1.1.3)interpupilarryDistance: Augenabstand für 3D
1.1.4)swapIntervallZero: improves lag
1.1.5)Extension: Experimental
1.1.6) Head Tracking on/off
1.1.7) OSD on/off
1.2))OSD specific settings: Achtung: noch in Entwicklung
1.2.1)model Distance: Abstand Virtual Kopter-Auge
2),3),4),... Ob man die jeweilige funktion vom OSD an/ausschalten möchte
2)Decoder Settings
1)Data Source: die app kann die raw h.264 streams entweder auf dem udp port 5000 empfangen,oder ein raw .h264 file(wie es die rpi cam erzeugt) parsen
Praktisch zum testen; man muss nur aufpassen,wenn die app ein File parst,wird der encoder so schnell wie möglich gefüttert, und es besteht
keine time-synchronisation
2)File Name 1: receiving data from file; das file muss auf demselben ort gespeichert sein,wo auch das "GroundRecording" file liegt;
3)Decoder MultiThread: empfohlen: an
4)Select your decoder: HW decoder unterscheiden sich sehr stark von Chipsatz zu Chipsatz. der SW decoder funktioniert auf allen Geräten,ist jedoch langsammer;
wenn der HW decoder nicht funktioniert,bitte im Thread schreiben
3)Ground recording Settings:
1)Ground Recording on/off. Kann bei langsammen Geräten Latenz erhöhen,muss aber nicht;
2)File Name 2: ground recording file
4)Debug Settings:
1)Latency: zeigt die messbare Latenz der app an; wie viele frames android buffert,ist schwer zu sagen, und hängt auch vom hersteller ab; mein huawei hat einen input lag von ~60ms (getestet,wer will kann mal die App OpenGLLagTest ausprobieren) ; angenommen der touchscreen hat 12ms verzögerung,dann buffert android wohl 3 frames (48ms); der Lag 'Info zu Pixel' ist dann "measured App latency+48ms)
2)UserDebug: disable for FPV flying !
3)DebugFile: klappt noch nicht ganz; Android Studio gibt deutlich mehr Informationen aus
-----------------------------------------------------------------------------------------------------
OSD: in Developement
FAQ:
1)warum kann ich nicht das wlan vom handy für wifibroadcast benutzen,und brauche den rx pi ?
-Android unterstützt keinen "Monitor mode" und auch wifibradcast hat noch niemand auf Android portiert; für die technisch versierten: Es geht schon,ist jedoch kompliziert; info's hier: https://befinitiv.wordpress.com/2015/04/18/porting-wifibroadcast-to-android/
2)wie hoch ist der Lag der App ?
Bei meinem Handy (Huawei ascend p7 , mali 450 mp gpu) gehen bei 49 fps von 130ms end-to-end latency etwa 60ms auf die app.
In den Einstellungen findet ihr ein "Latency file".
Der "overall measured lag of the app" sollte nicht höher als 20ms sein (bei mir: ~12ms); wenn er größer ist,dann Buffert der hw decoder vermutlich frames (ein feature von manchen herstellern,das für real-time streaming jedoch nur von Nachteil ist).
Achtung: Da das TestFile mit der max. Geschwindigkeit abgespielt wird,ist die "measured app Latency" nur beim Abspielen des udp Streams aussagekräftig.
Der restliche Lag (etwa 48 ms) entsteht durch "Android's SurfaceFlinger",welcher bis zu 3 "display-frames (16ms)" latency erzeugt.
Generell: Lag of App in ms=((3/OpenGlfps*1000)+measuredAppLatency);
Lag of Stream=EncoderLag+AppLag.
Die App ist schon so weit,wie es für einen "nicht-breadcom-hw-engineerer" geht, auf real-time optimiert. Und ich sage nicht ohne Stolz,dass ich mit dem "Software x264 encoder" und avconv auf meinem linux pc den Bildschirm bei 120fps unter 70ms auf mein Handy spiegeln kann - das ist mindestens genau so gut,wie die "GameStream" Angebote von nVidia oder steam ( https://youtu.be/a9-bdXUC0j0 ).
*UPDATE 29.03.2016: Setting swap intervall to zero reduces lag by 1 more frame on my device,and increases OpenGL fps*
3) Die usb Verbindung handy-rpi trennt sich nach kurzer Zeit:
Wenn das Handy angeschlossen wird,lädt der rpi es natürlich auf;
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=100244
Bei einem guten PowerSupply am rx Pi.
4) Warum ist die App nicht direkt eine "Cardboard-App" ?
Der "Disortion renderer" von Google Cardboard erzeugt noch einmal einen Lag von etwa 30ms, weshalb ich zwar Die Cardboard-API "HeadTracker" in meiner App benutze,den Stereoskopischen Effekt(leftEyeViewM,...) jedoch selber erzeuge.
Einziger Nachteil: Die VR brille sollte nicht zu sehr "verzerren".
Zuletzt bearbeitet: