With all of the buzz around HTML5 and the iPad, there's been a lot of talk about the technologies underlying digital video. Besides the inevitable codecs (H264 & VP8), experts are discussing video delivery mechanisms, using indecipherable acronyms like RTMP, CDN and HLS. This blog post will give an overview of the various video streaming methods in plain English and bring the all-round developer and publisher up to date.
In a nutshell, there are three widely used ways to stream a video: Progressive Download, RTMP/RTSP Streaming, and Adaptive HTTP Streaming. We'll look at the three in detail here, describing their pros, cons, and various technologies that support each.
Note: more streaming methods (like MultiCast or Peer 2 Peer) exist, but are of little use to the regular publisher. They are not widely adopted and/or only useful in specific situations.
Progressive Download is the most widely used video delivery method by far (in part because it's what YouTube uses). It's also easiest to implement: just put a video on your webserver and point your player to the URL. Once a user hits play, the player immediately starts downloading the file. The player will start video playback as soon as it has enough data to do so, but it will continue to download until it has received the whole file (hence the progressive).

Progressive Download is supported by Flash, HTML5 browsers, the iPad/iPhone and Android. On the server side, every regular webhoster supports downloads, as does every CDN (Content Delivery Network; webhosters that special in large-scale delivery). In most cases (Flash needs a small server module), it is possible to seek in a player to a not-yet-downloaded part of the video. At that point, the player re-downloads the video, starting at the seek offset instead of at the beginning. We call that feature pseudo-streaming.
The simplicity of Progressive Download also has its downsides. For one, bandwidth is wasted on data downloaded but not watched. Consider a user watching a ten minute video. They may leave the page after having watched only one minute of the video, but at that point the other nine minutes have already been downloaded. This means that the publisher has paid to transfer nine times as much data as the user actually watched - an expensive proposition on a large scale.
Another downside is the inability to change the quality of the video mid-stream: once the download starts, the video quality is locked. After switching a player to fullscreen, you generally see a blurry video, because it was intended to be watched at a much smaller size. Or, when you watch video on an iPad, your connection may switch from WiFi to 3G. Playback then stutters, because the download speeds are much lower on 3G.
In sum, Progressive Download works fine for short clips (a few minutes). For longer videos, the downsides start to impact playback too much. Plus, live streaming is not possible, as there's no downloadable file.
Because of the downsides of Progressive Download, RTMP/RTSP Streaming is widely used by professional media organizations like Hulu. This method uses specialized webservers that only deliver the frames of a video the user is currently watching. No data is downloaded in advance and data a user has seen is immediately discarded.

The most widely solution is used is RTMP (Real Time Messaging Protocol), the streaming protocol of Flash. It is supported by servers such as FMS and Wowza and most CDNs (but not by regular webhosters). HTML5 does not include a dedicated streaming protocol, nor does the iPad/iPhone. Android has support, for RTSP (Real Time Streaming Protocol). Unfortunately, RTSP is not widely supported by servers and CDNs.
This lack of support, especially on the server side, is the biggest drawback of RTMP/RTSP Streaming. Most publishers do not want to maintain expensive, dedicated servers to stream their videos. Additionally, the dedicated protocols (RTMP and RTSP) are often blocked by corporate firewalls.
On the plus side, RTMP streaming can change video quality mid-stream. This allows for optimal playback quality in the fullscreen and WiFi/3G scenarios described above. However, if the connection speed drops below the minimum bandwidth needed for the video, playback will be continuously interrupted. Unlike progressive download, users cannot pause a video and wait for enough data to download to ensure smooth playback.
In sum, RTMP/RTSP Streaming works great even for long-form or live video. It has specific server and protocol requirements, which makes it less accessible and adds significant complexity and cost as compared to Progressive Download.
Adaptive HTTP Streaming is a fairly new streaming format. It attempts to join the merits of RTMP/RTSP Streaming (bandwidth efficiency, quality switching) with those of Progressive Download (no special servers or protocol needed). Adaptive HTTP Streaming works by storing your videos on the server in small fragments (a few seconds each). The player then glues these fragments together into a continuous stream.

At present, Adaptive HTTP Streaming is supported by both Flash and the iPad/iPhone. Android supports it as of version 3 and support in HTML5 is currently under development. Since Adaptive HTTP Streaming leverages standard webservers, it is supported by webhosters and CDNs alike.
Although Adaptive HTTP Streaming eliminates many of the downsides of RTMP/RTSP Streaming and Progressive Download, it still has issues of its own, the biggest being the lack of standardization. Because it is a new technology, there is no single, widely used implementation. The most popular is currently Apple's HLS (HTTP Live Streaming), which is supported by the iPad/iPhone and Android 3.0. However, both Adobe and Microsoft have competing offerings (Zeri & Smooth) and the MPEG consortium is working on a standard named DASH.
It's also worth noting that none of the Adaptive HTTP Streaming implementations work with regular MP4 files. They all require your files to be converted from a regular MP4 into a specific fragmented format. Apple, Microsoft and Adobe each supply a tool for this, but support for these formats doesn't exist in regular video editors and transcoding tools (yet).
In summary, while Adaptive HTTP Streaming will likely become the single video streaming method over time, the technology is still fragmented (no pun intended) and ecosystem support is only beginning to arrive.
This table sums up support for the various streaming methods across devices and servers.
| Devices | Progressive Download | RTMP/RTSP Streaming | Adaptive HTTP Streaming |
| Adobe Flash Player | MP4, FLV | RTMP | HLS, Zeri, Smooth |
| HTML5 (Safari & IE9) | MP4 | - | - |
| HTML5 (Firefox & Chrome) | WebM | - | - |
| iOS (iPad/iPhone) | MP4 | - | HLS |
| Android Devices | MP4, WebM | RTSP | HLS (as of 3.0) |
| CDNs (e.g. CloudFront) | MP4, FLV, WebM | RTMP | HLS |
| Web Servers (e.g. S3) | MP4, FLV, WebM | - | HLS |
Comments
Excellent your streaming note!
Can you explain more about CPU Usage when loading a video? Does it depends of size of the video file? I think would be a nice theme to talk about.
Thanks!
Submitted by Erick Rugerio on Thu, 2011-04-28 04:34.
Very helpful overview. Thanks!
Submitted by Shalom Ormsby on Thu, 2011-04-28 20:05.
This is so good Jeroen, excellent.
Submitted by Dennis Lundin on Fri, 2011-04-29 02:09.
CPU usage for loading should be negligible compared to CPU for playback on all devices. However, there is one exception: inside Flash, for progressive downloads, CPU usage for loading is quite high. It's really strange and we never got why that is the case, but it is definitely happening.
Submitted by JeroenW on Fri, 2011-04-29 03:08.
Extremely helpful insight on how this fucntions. For a layman like me, this technology is beginning to make sense
Submitted by Ajay Karat on Fri, 2011-04-29 04:29.
Nice explanation. Thanks.
Can JWPlayer play HLS HTTP Live Streaming such as
http://demo.anevia.com/hls/hls/redbull_linecatcher.m3u8
What are the subtitle formats supported by JWPlayer?
Submitted by Carlos Rocha on Tue, 2011-05-17 13:39.
The JW Player can indeed play HLS streams. With the regular player, this works only on an iPhone/iPad or with Safari. We also have an in-development version that allows playing HLS streams in Flash though. It can be found here:
http://developer.longtailvideo.com/trac/browser/branches/adaptive
For subtitles, the player supports SRT, DFXP and MP4 TimedText:
http://www.longtailvideo.com/support/addons/captions-plugin/14974/
Submitted by JeroenW on Wed, 2011-05-18 10:55.
For my company's new service we have been trying to get adaptive streaming working for Android and iOS devices. We originally were using Smooth Streaming for desktops and were able to use Microsoft software to convert this to HTTP Live Streaming files. This works great on iOS devices, but I've found that Android's support is very spotty. It actually works much better in Android 2.3 than it does in 3.0. So, I've looked into your adaptive media provider that you linked to, and it seems to be exactly what I need, but it doesn't quite work. There are some minor issues that I was able to work around, but the big problem is that it is unable to transition between fragments on Android. I'd like to offer some help in ironing out these issues, but couldn't figure out how to post bug reports or submit patches, and this is the only way I could find to contact you.
Submitted by Matt Cosentino on Thu, 2011-05-26 18:46.
@Matt Cosentino - You can contact us here - http://www.longtailvideo.com/support/contact-us
Submitted by Ethan LongTail on Thu, 2011-05-26 19:02.
@Jeroenw: Thank you for the great work to support HLS natively in flash. When do you think this will be a supported feature in the released version of jwplayer? This will be key so we can have a standard encoding solution across client platforms.
Thanks and keep up the great work!
Submitted by Dan on Sun, 2011-08-14 16:43.
I do think we'll keep this as a separate plugin for now (next 6 months?). We're holding off until there's a good breakthrough in HLS support (e.g. FMS supporting it, or Android 3 becoming the "main" version).
At present, there's also still quite some people with Flash Player 10.0 (~15%). Since the plugin needs 10.1, they won't be able to see HLS streams.
Submitted by JeroenW on Mon, 2011-08-15 03:53.
My understanding is that Apple's HLS system on works on OS X and iOS. If someone wants to publish and allow playback on streaming media using HTTP, and wishes to reach OS X, iOS, Windows, and Android clients, any ideas which route(s) to go?
Submitted by Bob on Sun, 2011-10-16 15:23.
Solely using HTTP does not work, since you're then missing out on a chunk (15%) of desktop users that don't have Flash 10.1+ installed. You should use RTMP for the desktop and Android, plus HLS for iOS.
Submitted by JeroenW on Mon, 2011-10-17 10:51.
Hi,
I have a streaming server, playing Apple HLS ans Adobe HDS.
Is JWPlayer playing those kind of streams ?
Gilles
Submitted by Gilles on Fri, 2012-01-27 07:31.
JW Player can play HLS streams. By default, this only works on iOS, but you can use this plugin to also play the streams in Flash:
http://developer.longtailvideo.com/trac/browser/branches/adaptive
Submitted by JeroenW on Mon, 2012-01-30 05:21.
Does Adaptive stream works on Android devices? if so, Please provide me some tips/instructions to build HLS
Submitted by SK on Tue, 2012-02-14 20:51.
HLS streaming should work on Android 4.0 devices, but we don't have a device to confirm this yet. According to the specs, HLS also works on Android 3.x devices, but on our test device (Galaxy Tab 10.1), this consistently crashes. Android 2.x devices (the far majority) do not support HLS.
I'd wait a little while until it's confirmed Android 4.x does play HLS correctly and it has some market share.
Submitted by JeroenW on Wed, 2012-02-15 04:51.
Thanks for Article.
Can any one provide sample code on video streaming using adaptive http streaming in Android.
Submitted by cholla on Tue, 2012-02-28 17:07.
It's as simple as this:
<video src="manifest.m3u8"></video>
Submitted by JeroenW on Wed, 2012-02-29 10:21.
easy to understand explanation. Thanks.
Submitted by D on Sat, 2012-07-07 21:36.
very clear explanation! Thanks for grt tutorial
Submitted by Rishabh Parekh on Tue, 2012-10-16 06:10.
Great info thanks Jerone.
Submitted by Clive Davis on Mon, 2012-12-10 02:08.
thanks for the detailed info.
Submitted by yash on Mon, 2013-02-18 04:53.
Post new comment