Nadat de keuze voor UDP gemaakt was ben ik op zoek gegaan naar enkele voorbeeld projecten en tutorials die werken met streaming over UDP. Hierbij heb ik gekeken naar de werkzaamheid en of deze ingezet konden worden met het eindresultaat in gedachte. De tutorials zijn vervolgens verder uitgewerkt en omgezet naar een prototype om te zien hoe deze functioneren.
Prototype 1 & 2 zijn onderzocht voor het gesprek met de stakeholder. Voor dit gesprek lag mijn focus op het streamen van statische video’s en afbeeldingen. Hierom ondersteunen deze prototypes geen screencasting. Na het gesprek is deze focus verschoven en is screencasting de hoofdstreamings-feature voor het prototype geworden. Prototype 3 heeft hier de focus op gelegd.
Het verschil tussen screencasting en screen mirroring
Mirroring en Screencasting zijn twee benamingen voor het weergeven van het scherm van device a op het scherm van device b. Het verschil hierbij is dat screen casting iets anders kan weergeven. Bij screen mirroring word altijd hetzelfde een duplicaat van het scherm getoond. Springt het scherm op stand-by/slaapstand dan wordt ook de getoonde content zwart.
Bij screencasting blijft het scherm gelijk aan de gestreamde content in een app. Dit blijft dus beperkt tot de stream die opgezet is. Zodra de gebruiker een video streamt zal dit op het scherm te zien zijn ook wanneer de het scherm uit staat.
Een van de termen die veel voorbij komt is Miracast. Miracast wordt omschreven als HDMI over Wifi en is een standaard voor draadloze connecties. Miracast maakt het mogelijk om vanaf telefoons te screencasten en te mirror-en. Hoewel in android 4.2 Miracast werd toegevoegd werd deze er in android 6 uitgehaald en vervangen door google cast. Sommigen fabrikanten waaronder Samsung maken nog gebruik van Miracast.
1. Kodi voor de Raspberry Pi (UDP/TCP)
Een van de projecten die ik onderzocht was Kodi. Kodi is een oplossing voor het streamen van zowel afbeeldingen als video vanaf zowel een Android als iOS device. Hierbij maakt Kodi gebruik van DLNA (Digital Living Network Alliance).
DLNA is een certificering die gebruik maakt van UPnP (Universal Plug ’n Play). UPnP maakt gebruik van zowel UDP als TCP. Hierbij wordt de UDP verbinding tot stand gebracht over poort 1900. De poorten voor TCP worden verkregen aan de hand van de SSDP-berichten (Simple Service Discovery Protocol).
Hoewel Kodi beide platformen ondersteunt was ik niet tevreden over het resultaat. De streaming van Kodi is uiteraard prima maar zodra Kodi gestart is volgen er eerst nog enkele handelingen voordat de video getoond wordt. Voor een gebruiker zijn deze handelingen niet te doen in de huidige context van het systeem. Daarbij komt nog dat zodra er niets gestreamd wordt het Kodi menu voor de gebruiker zichtbaar blijft. Kodi is een prima tool om thuis te streamen maar voor deze toepassing niet.
2. Raspicast (RTP/UDP)
Na het testen en mijn ervaring met Kodi heb ik verder gezocht. Hierbij vond ik een interessant project: Raspicast. Raspicast maakt gebruik van RTP (Real-time Transport Protocol).
Bij RTP verpakt de server de media-data in RTP-pakketten die vervolgens via een socket worden verzonden. Aan de besturingssysteemkant van de socket worden UDP-pakketten gegenereerd om rond RTP-pakketten te wikkelen en aan IP overhandigd voor transmissie over een link zoals ethernet. Bij de ontvanger vindt het omgekeerde proces plaats.
Hoewel de Raspicast er niet voor iOS is zijn de voordelen groter. De content reageert sneller op bijvoorbeeld de play en pause functies. Ook heeft het geheel extra functionaliteiten waaronder het loopen van een video en de content wordt sneller gestreamd dan bij Kodi. Daarbij is Samsung een van de stakeholders, ondersteuning voor iOS zou mooi zijn maar is geen must. Raspicast maakt gebruik van omxplayer die op het moment van streamen activeert. Hierdoor is het bureaublad continu zichtbaar buiten streams om. Dit is echter geen probleem, met een geniepig trucje (door de muis, taakbalk en alle iconen te verbergen) blijft er een zwart scherm over. Dit is de gewenste situatie (een zwart scherm met verbindings- en/of statusinformatie tot het moment dat de stream start) zoals met het streamen bereikt dient te worden.
3. VLC (TCP/UDP)
VLC is een van de meest bekende Mediaplayers en ondersteunt het om zowel te streamen als streams te ontvangen door middel van commands via een terminal. Dit maakt VLC een zeer geschikte tool om verder te onderzoeken. Omdat in de huidige situatie waarin ik het systeem voor mij zie de client en server omgedraaid zijn (de client, de Raspberry Pi, vraagt de video aan bij de server, de mobile app.) is dit een groot voordeel. Dit zou inhouden dat zodra je op de button drukt om te streamen je een ssh call maakt en vanuit de terminal de stream opvraagt. De gegevens die nodig zijn om de screencasting size te bepalen en onbekend zijn bij de client, zoals width en height, worden rechtstreeks vanuit het device meegestuurd en gebruikt in de call.
VLC heeft de mogelijkheid om te streamen over TCP en UDP.
VLC heeft als extra voordeel dat het programma zeer aanpasbaar is. Hierdoor is het mogelijk om alle overige features weg te werken en het gewenste zwarte scherm te tonen. Met deze oplossing komt het systeem er als volgt uit te zien.
Bibliografie
Cawley, C. (2018). Raspberry Pi Media Center: How to Install Kodi on Raspbian. Retrieved from MUO – Make Use Of : https://www.makeuseof.com/tag/install-kodi-raspbian-media-center/
MediaCodec. (2018). Retrieved from Android Developer: https://developer.android.com/reference/android/media/MediaCodec
MediaMuxer. (2018). Retrieved from Android Developer: https://developer.android.com/reference/android/media/MediaMuxer
MediaPlayer. (2018). Retrieved from Android Developer: https://developer.android.com/reference/android/media/MediaPlayer
Salminen, V. (2018). How to use your Raspberry Pi as a Chromecast alternative. Retrieved from The Pi: https://thepi.io/how-to-use-your-raspberry-pi-as-a-chromecast-alternative/
Simon. (2018). libstreaming. Retrieved from Github: https://github.com/fyhertz/libstreaming
Simon. (2018). spydroid-ipcamera. Retrieved from Github: https://github.com/fyhertz/spydroid-ipcamera
Surface. (2018). Retrieved from Android Developers: https://developer.android.com/reference/android/view/Surface
Surface and SurfaceHolder. (2018). Retrieved from Android Source: https://source.android.com/devices/graphics/arch-sh
SurfaceTexture. (2018). Retrieved from Android Source: https://source.android.com/devices/graphics/arch-st
SurfaceView. (2018). Retrieved from Android developers: https://developer.android.com/reference/android/view/SurfaceView
SurfaceView and GLSurfaceView. (2018). Retrieved from Android Source: https://source.android.com/devices/graphics/arch-sv-glsv