https://howvideo.works/#processing This app works best with JavaScript enabled. Logo HowVideo.works How video works This is an informational site about video and how it works. Learn all about what it takes to Playback, Deliver, and Process video. Stay tuned for more about video Capture. 1 Playback Delivery 2 Processing 3 4 Capture Brought to you by Mux Logo Logo HowVideo.works Playback Playback Playback Playback Delivery Delivery Delivery Delivery Processing Processing Processing Processing Capture Capture Playback HLS Manifest Files DASH Adaptive Bitrate Streaming MP4 & WebM Players Delivery Content Delivery Networks How Video Content Travels Multi-CDN Processing Foundational concepts Media Processing Playback It might seem obvious, but there's a lot wrapped up in the word "playback"! The video player's UI is the first thing that most people associate with playback since it's what they see and interact with the most whenever they watch video on a site or platform. The icons and colors used in a player's controls might be the most visible to the end-user, but that's just the tip of the playback iceberg. The player controls or exposes other vital aspects of playback beyond just the controls themselves. Its functionality includes features like subtitles and captions, programmatic APIs for controlling playback, hooks for things like client-side analytics, ads, and much more. Perhaps most importantly, a modern video platform will use what's called adaptive bitrate streaming, which means they provide a few different versions of a video, also known as renditions, for the player to pick from. These different versions vary in display sizes (resolutions) and file sizes (bitrate), and the player selects the best version it thinks it can stream smoothly without needing to pause so it can load more of the video (buffering). Different players make different decisions around how and when to switch to the different versions, so the player can make a big difference in the viewer's experience! You might remember watching videos on Netflix or Youtube and noticing that sometimes in the middle of the video the quality will get worse for a few minutes, and then suddenly it will get better. That is what you saw when the quality changes you are experiencing adaptive bitrate streaming. If you are doing any kind of video streaming over the internet your solution must support this feature, without it it's likely that a large number of your viewers will be unable to stream your content. Iceberg Image HLS While the concept (and spec overall) can be intimidating, the basic concept behind HLS is surprisingly simple. Even though the term stands for "HTTP Live Streaming", this technology has been adopted as the standard way to play video on demand. You take one big video file and break it up into small segments that can be anywhere from 2-12 seconds. So if you have a two-hour-long video, broken up into 10-second segments, you would have 720 segments. Each segment is a file that ends with .ts. They are usually numbered sequentially so you get a directory that looks like this: * segments/ + 00001.ts + 00002.ts + 00003.ts + 00004.ts The player will download and play each segment as the user is streaming. And the player will keep a buffer of segments in case it loses network connection later. Now let's take this simple HLS idea a step further. What we can do here is create the segment files at different renditions. Working off our example above, using a 2-hour long video with 10-second segments we can create: * 720 segment files at 1080p * 720 segment files at 720p * 720 segment files at 360p The directory structure might look something like this: * segments/ + 1080p/ o 00001.ts o 00002.ts o 00003.ts o 00004.ts + 720p/ o 00001.ts o 00002.ts o 00003.ts o 00004.ts + 360p/ o 00001.ts o 00002.ts o 00003.ts o 00004.ts Now, this starts to get cool, the player that is playing our HLS files can decide for itself which rendition it wants to consume. To do this, the player will try to estimate the amount of bandwidth available and then it will make its best guess as to which rendition it wants to download and show to you. The coolest part is that if the amount of bandwidth available to the player changes then the player can adapt quickly, this is called adaptive bitrate streaming. Manifest Files (a.k.a. Playlist Files) Since the individual segment files are the actual content broken up into little pieces it is the job of the manifest files (aka playlist files) to tell the player where to find the segment files. There are two different kinds of manifest files. For a single video there is one master manifest and multiple rendition manifests. The master manifest file is the first point of contact for the player. For an HTML player in the browser, the master manifest is what would get loaded as the src= attribute on the player. The master manifest will tell the player about each rendition. For example, it might say: * I have a 1080p rendition that uses 2,300,000 bits per second of bandwidth. It's using these particular codecs, and the relative path for that manifest file is "manifests/rendition_1.m3u8". * I have a 720p rendition that uses 1,700,000 bits per second of bandwidth. It's using these particular codecs, and the relative path for that manifest file is "manifests/rendition_2.m3u8". * I have a 360p rendition that uses 900,000 bits per second of bandwidth. It's using these particular codecs, and the relative path for that manifest file is "manifests/rendition_3.m3u8". When the player loads the master manifest it observes all the renditions that are available and picks the best one. To continue this example, let's say our player picks the 1080p resolution because the player has enough bandwidth available. So now it's time to load the rendition manifest ("manifests/rendition_1.m3u8") The rendition manifest looks a lot different than the master. It is going to have some metadata and a link to every individual segment. Remember the segments from up above are the actual pieces of video content. In our example of a 2-hour long video broken up into 720 segments of 10 seconds each. The rendition_1.m3u8 manifest is going to have an ordered list of the 720 segment files. As one would expect, for a long video, this file can get quite large: * segments/1080p/00001.ts * segments/1080p/00002.ts * segments/1080p/00003.ts * segments/1080p/00004.ts * segments/1080p/00005.ts * ....etc for 720 segments In summary, these are the steps the player goes through to play a video: 1. Load the master manifest which has information about each rendition 2. Find out which renditions are available and pick the best one (based on available bandwidth) 3. Load the rendition manifest to find out where the segments are 4. Load the segments and start playback 5. After playback starts, that is when we get into adaptive bitrate streaming. DASH DASH employs the same strategy as HLS. One video file is broken up into small segments of different resolutions. The format of a DASH playlist file is in XML instead of plaintext like it is with HLS. The specifics of how the DASH manifest tells the player where to find each segment file is a little different. Instead of linking to each segment specifically, the DASH manifest supplies a "SegmentTemplate" value that tells the player how to calculate the specific link for each segment. Whether using HLS or DASH, the biggest benefit that they both bring to the table is that manifest files and segments are delivered over standard HTTP. Having a streaming format that works over standard HTTP means that all of this content can be served over tried and true HTTP servers and it can be cached of existing CDN infrastructure. Moving all of this video content around is as simple as sending and receiving HTTP requests. Adaptive Bitrate Adaptive Bitrate Streaming For both HLS and DASH, since we are creating all these different renditions of our content, players can adapt to the different renditions in real-time on a segment-by-segment basis. For example, in the beginning, the player might have a lot of bandwidth, so it starts streaming at the highest resolution available (1080p). Streaming is going smooth for the first 5 minutes. At the end of the first 5 minutes maybe the internet connection starts to suffer and now less bandwidth is available, so the player will degrade to 360p for as long as it needs to. Then, as more bandwidth becomes available again, the player will ratchet back up to higher resolutions. All of this resolution switching is entirely up to the player. Using the right player can make a huge difference. Let's take a real-world example. You open up Netflix on your mobile device and decide to watch The Office for the 11th time in a row. After you scroll around and pick your favorite episode (Season 2 Episode 4) and hit play. Now the player kicks into gear and you see a red spinner. What is going on behind the scenes while you see the red spinner is that the player is making an HTTP request to Netflix's servers to determine what resolutions are available for this video. Next, the player will run a bandwidth estimation algorithm to get a sense of how strong your internet connection is. Right now, you are on a good wifi connection so the player will start playing at the highest rendition available for your screen size. As you are watching this 23-minute episode of The Office the player is working hard in the background to keep up with your streaming. Let's say you go for a walk and get off the WiFi and now you're on a cellular network and you don't have a strong signal. You may notice that at times the video gets a little blurry for a few minutes, then it recovers. Right before the video got blurry the player determined that there was not enough bandwidth available to keep streaming at a high rendition, so it has two options (1) Buffer, meaning pause the video and show a loading spinner and make you wait while it downloads more segments or (2) Degrade to a lower resolution so you can keep watching. A good player will pick number 2: it's better to give you a lower resolution instead of making you wait. The player's goal is always to give you the highest rendition that it can, without making you wait. MP4 & WebM MP4 and WebM formats are what we would call pseudo-streaming or "progressive download". These formats do not support adaptive bitrate streaming. If you have ever taken an HTML