Native immersive 360° VR video playback on Android with Spectaculum
Playback of immersive 360° video on Android is usually done in a WebView with an HTML5 video player. This tutorial demonstrates how to display 360° video in a native view widget to save the overhead of a whole browser stack. This is done by using the versatile Spectaculum view widget for video rendering and the popular ExoPlayer for video decoding. Both of these libraries are open source under the Apache 2.0 license and available on GitHub and the JCenter repository.
Spectaculum is a view widget for Android to display visual content in a GLES accelerated context, providing zooming and panning functionality, parameterized shader effects, and frame grabbing. It comes with additional views that save developers a lot of time and implement all functionality for displaying bitmap images, camera preview, and videos through the Android MediaPlayer, MediaPlayer Extended, and ExoPlayer. The packaged shader effects range from simple color filters to immersive 360° VR video rendering.
The Spectaculum view can be used with all sources that can write to a surface or surface texture, which is essentially every visual content source, but I recommend using one of the many available modules if applicable. Example use-cases are photo galleries and picture viewers with zooming/panning support and optional picture effects through shaders (e.g. contrast adjustment, color correction), video players with live image adjustments through shaders and 3D/360°/immersive/VR playback, and camera previews with live effects. An extensive documentation on functionality, API, usage, and modules is available on GitHub. The library is also available from JCenter’s Maven repository, and a demo app that showcases various views and shader effects is available on the Play Store.
Spectaculum on GitHub
Android’s Matrix.setRotateEulerM(…) function contains a bug and returns a wrong matrix result when rotating around the Y-axis. Googling android setRotateEulerM bug returns just 15 hits out of which only the first one is relevant: a neglected AOSP issue, marked as obsolete, that luckily contains the fix in comment #3. This bug has been reported in 2010 for Android 2.2 and still exists today in Android 6.0.1.
Left: rotation gone wrong. Right: rotation with fixed function.
Can it really be the case that almost nobody is using this function although there are thousands of OpenGL apps and games around? Why is it not discussed more frequently? Why is it marked as obsolete? Is this not a bug, but a case of incorrect usage?
A new website presenting my professional software development services is now online.
Protyposis Multimedia Solutions
Since the previous post from about a year ago, the ITEC MediaPlayer for Android has evolved to its second major version, receiving a lot of bugfixes, a rewritten playback core with huge performance improvements, and the ability to playback audio-only sources. Its new name now bumps it to version 3.0 and it is reaching a point where I feel confident that it can be used in production, and in fact, people are already starting to use it.
Klubus – Public Transport Departure Monitor App for the City of Klagenfurt am Wörthersee
Klubus is a small and simple Android app to quickly check departure times at all public transport stops and stations across the City of Klagenfurt am Wörthersee, Austria. It is made for people who are familiar with the transport network and just want a quick and simple way to check the departure times, and is now available on the Play Store.
The ITEC MediaPlayer library for Android has been updated to 1.4.0. This new version mainly improves DASH support, but also has a few bugs fixed, small changes and additions to the MediaPlayer/VideoView API, and improved error/exception reporting.
The DASH MPD parser now covers a lot more use cases, including some of the DASH-IF test vectors for which an evaluation protocol is available in the sources. Experimental playback of dynamic content (live streams) is also possible now, but MPD updates are not supported yet. An important feature that is still missing is support of single-segment streams, which is why many of the test vectors still fail. Anyway, the API of the current version should remain stable for some time while all the missing functionality can be implemented under the hood, if interest calls for it. The demo app has also been updated with the new version of the library and a few usability improvements.
The library is available on GitHub, with updated documentation and sources. Release builds can be obtained from the JCenter repository for easy usage in Android projects through Gradle and Maven. The demo app is online on the Play Store.
ITEC MediaPlayer on GitHub
The ITEC MediaPlayer library is a lightweight VideoView/MediaPlayer replacement for Android’s default components, enhancing it with exact frame seek, playback speed adjustment, GLES shader effects, picture zoom/pan by gestures, and DASH support. The source code and a more detailed description is now available on GitHub, its accompanying demo showcase app on the Google Play Store.
Die App AAU Studentenportal wurde heute vollständig eingestellt. Ein offizieller Nachfolger ist in Arbeit.
Fast genau 3 Jahre nach dem Start hat nun das endgültig letzte Stündlein für das AAU Studentenportal geschlagen. Obwohl die offizielle Abschaltung eigentlich schon im August 2013 mit der Herausnahme der App aus dem Google Play Store erfolgte, ist sie stillschweigend weiter gelaufen und wurde fleißig über Seitenkanäle verbreitet. Das ungebrochene Interesse von Studenten veranlasste mich einen erneuten Versuch der Zusammenarbeit mit dem ZID zu starten und mehrere Konzepte für einen Relaunch zu erarbeiten, durch diverse Unstimmigkeiten und unterschiedliche Interessen war es aber leider nicht möglich, eine sinnvolle Kooperationsbasis für Betrieb, Wartung und Weiterentwicklung zu finden. Die App wurde nun auf meine Initiative mit dem heutigen 1. August vom Zugriff auf die Uni-Server ausgesperrt und damit stillgelegt. Ab diesem Tag erscheint beim Starten der App eine Fehlermeldung im Anmeldebildschirm (“Keine Authorisierung vorhanden”, bzw. “Authorization missing”). Ich bedanke mich bei allen Usern der App und empfehle euch nun die Deinstallation.
ClockDrift: On-the-fly measurements of clock drift in multimedia devices
Over the last year, I’ve been extensively researching and wasting time on an effect called clock drift in the multimedia domain. Clock drift is the deviation of a clock’s speed from the word time standard‘s speed, resulting in shifts in sampling rates, and this shift leads to parallel recordings from different devices not being synchronizable without manual post-processing. Because each recording is sampled a bit differently, they all run at a slightly different speed when played back in parallel on a single device, like it happens in a non-linear editing system on a computer workstation. To conclude this topic, I have just published an Android app called ClockDrift, which helps to measure drift in multimedia devices. I have also written an accompanying ClockDrift App User Guide and a general introduction into the topic, Clock Drift in Multimedia Recordings.