Streaming video on mobile devices remains one of the most challenging and frustrating experiences for viewers and broadcasters alike. When HTTP Live Streaming (HLS) was introduced, the goal was simple: easily stream live and on-demand video content to devices with a variety of bandwidth connections. Adaptive streaming is the marquee feature of HLS, and while Adobe’s RTMP can offer similar capabilities in Flash, desktop browsers like Chrome and Firefox can play HLS streams using a player like the JW Player. HLS is enhanced further by native implementations found within Safari and iOS, which makes streaming to mobile devices even easier.
So, what’s the problem?
Android and the lack of native HLS support.
All Hail Apple?
To be fair, it’s not all Android’s fault for lacking support for HLS in version 4.2 and beyond. Even the major desktop browsers have not yet implemented native HLS playback, and the only way to do so is through a Flash plugin. This doesn’t bode well for those of us who like to design sites for both the desktop and mobile devices, since the later generally can’t use Flash.
Android’s HLS implementation has a storied and turbulent past. Basic support was introduced in 3.0 (Honeycomb), but has never worked well enough for practical use. Below is an overview of the issues that have been found in each major Android version. We’ve also included a chart showing how widespread each version of Android is in the market:
Android 2.3 (Gingerbread)
- No Support, despite being the most popular version of Android
Android 3.0 (Honeycomb)
- Streams cause tablet devices to crash
Android 4.0 (Ice Cream Sandwich)
- VOD streams do not seek
- Aspect ratios are not detected and cause image deformation
- Fullscreen causes videos to restart from the beginning
Android 4.1+ (Jelly Bean)
- Aspect ratio issue is fixed, but seek is still unavailable
- Chrome does not understand HLS leading to broken mimetype detection
- Taking video fullscreen causes devices to throw an error and stop.
You can see these HLS issues for yourself by viewing the sample stream we provide on our HTML5 report.
Android’s lack of native HLS support is one of the factors for why streaming to mobile devices remains a challenge. Since HLS is a proposed draft from Apple, and not yet an accepted standard by the IETF, companies like Google and Microsoft are both wary about ceding any control of their platform to Apple. With everyone gunning for a piece of the mobile market, it makes sense that a non-proprietary standard, like MPEG DASH, would help make adaptive streaming more prolific.
With Android shipments and activations now outpacing iOS devices, broadcasters need to find a way to deliver HLS video to non-Apple devices. Since HLS streaming is supported on Android version 2.3-4.0 via Flash, you have to assume the user experience will be sub-par (see the aforementioned issues). Additionally, Flash support was discontinued in Android 4.1, meaning future versions of the OS cannot play back HLS streams natively.
A way around this limitation is to either build your own app’s implementation, or utilize an SDK from a third party vendor. However, this approach can be time consuming or impractical for some broadcasters. Additionally, it requires you to maintain and distribute an application to your users.
The easiest way to support HLS streams on Android or other non-iOS platforms is to offer a fallback RTSP stream. The main advantage to using an RTSP is that there is no need for Flash or any special client configuration. For example, if you use the JW Player for video playback, setting the player’s fallback to false will cause an RTSP stream to be loaded instead of an HLS M3U8 stream. This technique works great with the Wowza Media Server and is compatible with Android 2.3, 4.0 and 4.2 via the OS’ native player. You can learn more about this on our Apple HLS guide.
Until either a new non-proprietary standard is adopted, or each of the mobile platforms implement native HLS support, it looks like streaming to devices like Android will remain a challenge. Only time will tell…