{"id":22077,"date":"2020-06-01T14:56:50","date_gmt":"2020-06-01T14:56:50","guid":{"rendered":"http:\/\/http_live_streaming_hls_a_practical_guide"},"modified":"2025-02-16T10:17:15","modified_gmt":"2025-02-16T18:17:15","slug":"http_live_streaming_hls_a_practical_guide","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide","title":{"rendered":"HTTP Live Streaming (HLS): a Practical Guide"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>Originally developed for Apple, <a href=\"https:\/\/cloudinary.com\/video_api\">HTTP Live Streaming (HLS)<\/a> is a video-streaming protocol, supported by Android and other mobile platforms. HLS uses adaptive bitrate to adjust video quality to each viewer\u2019s internet speed and device capabilities. Presently, HLS is mandatory for live streaming on certain mobile devices and most HTML5 video players.<\/p>\n<p>This is part of a series of articles about <a href=\"https:\/\/cloudinary.com\/guides\/live-streaming-video\/a-guide-on-live-streaming-and-tips-for-making-it-a-success\">Live Streaming Video<\/a>.<\/p>\n<p><strong>In this article you will learn about the following topics:<\/strong><\/p>\n<ul>\n<li>\n<a href=\"#http-live-streaming\">What is HTTP live streaming?<\/a>\n<\/li>\n<li>\n<a href=\"#hls-work\">How does HLS work?<\/a>\n<\/li>\n<li>\n<a href=\"#pros-cons\">What are the pros and cons of HLS?<\/a>\n<\/li>\n<li>\n<a href=\"#compare\">How do other live-streaming protocols compare to HLS?<\/a>\n<\/li>\n<li>\n<a href=\"#basic-deploy\">How do you deploy basic HLS?<\/a>\n<\/li>\n<li>\n<a href=\"#cloudinary-hls\">How does Cloudinary help you set up HLS?<\/a>\n<\/li>\n<\/ul>\n<h3 id=\"http-live-streaming\">What Is HTTP Live Streaming?<\/h3> \n<p>Again, HLS is a protocol that streams videos by means of an adaptive bitrate. Initially designed for Apple devices, HLS now works on other devices, including Android phones, Smart TVs, game consoles, and more.<\/p>\n<p>\nHLS sends audio and video over HTTP from an ordinary web server. It can run on almost any server and is designed for reliability. HLS allows client devices to raise or lower the quality of the stream and optimize playback for the available speed of both wired and wireless connections. It&#8217;s considered the video delivery \u201ctechnology of now\u201d and is the preferred way to deliver streaming video to users.\n<\/p>\n<p>You can deliver HLS videos through standard web servers or <a href=\"https:\/\/cloudinary.com\/blog\/introducing_multi_cdn_media_delivery_solutions_for_optimal_per_user_experience\">content delivery networks (CDNs)<\/a>. During that process, HLS automatically adapts the video quality to match the viewer\u2019s Internet speed, smoothly delivering videos of any quality, from 8K (UHD) to 144-pixel ones.<\/p>\n<p>Related content: Read our guide to <a href=\"https:\/\/cloudinary.com\/guides\/live-streaming-video\/preparing-live-streams-for-video-on-demand\">vod live stream<\/a>.<\/p>\n<h3 id=\"hls-work\">How Does HLS Work?<\/h3> \n<p>HLS streams videos by leveraging three components: video data, distribution channels, and client devices.<\/p>\n<h3>Video Data<\/h3>\n<p>HLS can stream videos from two primary sources:<\/p>\n<ul>\n<li>\n<strong>Content servers<\/strong> for on-demand streaming<\/li>\n<li>\n<strong>Real time video sources<\/strong> for live streaming<\/li>\n<\/ul>\n<p>Before streaming can proceed, two processes must first take place, typically on a server before data distribution starts:<\/p>\n<ul>\n<li>\n<strong>Encoding<\/strong>, whereby video data is formatted according to either the H.264 or H.265 video-compression standard, which enables devices to recognize and decode data correctly. This process also creates video copies with different quality levels.<\/li>\n<li>\n<strong>Segmentation<\/strong>, whereby video data is divided into short segments of a <a href=\"https:\/\/developer.apple.com\/documentation\/http_live_streaming\/hls_authoring_specification_for_apple_devices#overview\">standard length of six seconds<\/a>. Afterwards, index files are created to specify the order and timing in which to play the segments.<\/li>\n<\/ul>\n<h3>Distribution Channels<\/h3>\n<p>Once encoded and segmented, videos can be streamed to viewers in direct response to requests made to a content server. Alternatively, streaming can occur through a CDN, with which you can more easily distribute streams across a geographic area and cache data for faster delivery to client devices.<\/p>\n<h3>Client Devices<\/h3>\n<p>Client devices receive and display video data on smartphones, laptops, desktops, smart TVs, and other connected devices. On receiving a video file, a client device determines the order in which to play the segments according to the index file. Additionally, based on the connection speed, local system resources and screen dimensions, client devices figure out which stream quality to adopt.<\/p>\n<p>For details on streaming, see this post: <a href=\"https:\/\/cloudinary.com\/blog\/the_future_of_audio_and_video_on_the_web\"><em>The Future of Audio and Video on the Web<\/em><\/a>.<\/p>\n<h3>Client Support and Latency<\/h3>\n<p>\nHLS is universally supported and is a common way to stream video to mobile devices, tablets, or <a href=\"https:\/\/cloudinary.com\/blog\/html5_video_tags_won_t_do_for_your_videos\">HTML5 video<\/a> players. It&#8217;s supported by most devices, including media players, streaming media servers, iOS, Safari, and the latest versions of Android browser and Chrome.\n<\/p>\n<p>Traditionally , HLS latency was higher than that of other streaming options with up to a 30-second delay. In late 2019, Apple introduced an HLS <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2019\/502\/\">low latency mode<\/a> that provides sub-two-second latency for live streaming. Originally, low latency HLS required changes in the way publishers authored and served video streams, and special support by clients and CDNs. However, as of May 2020, low <a href=\"https:\/\/cloudinary.com\/glossary\/latency\">latency<\/a> is an integral part of the HLS protocol.<\/p>\n<h3 id=\"pros-cons\">What Are the Pros and Cons of HLS?<\/h3> \n<p>HLS offers the following benefits:<\/p>\n<ul>\n<li>HLS\u2019s adaptive-bitrate capabilities ensure that broadcasters deliver the optimal user experience and minimize buffering events by adapting the video quality to the viewer\u2019s device and connection.<\/li>\n<li>Players can automatically adapt and adjust for changes in network speed, preventing stalls when the local connection is unstable.<\/li>\n<li>HLS is natively supported on Microsoft Edge 12-18, Safari 6+, iOS Safari 3.2+, Android Browser 3+, Opera Mobile 46+, and Chrome for Android 81+.<\/li>\n<li>It can be deployed on almost all other client devices via an HLS-compatible video player<\/li>\n<\/ul>\n<p>Note the flip side of HLS:<\/p>\n<ul>\n<li>Live-streaming with HLS is typically delayed by 20 to 60 seconds.<\/li>\n<li>HLS has less impact on short-form videos. If you\u2019re planning to deliver 10 seconds clips, better use progressive download\u2014a technique that lets you deliver a small part of the video file, and download the rest while the video is playing.\n<ul>\n<li>See <a href=\"https:\/\/cloudinary.com\/blog\/automatic_video_transcoding\">Automatic Video Transcoding<\/a> and <a href=\"https:\/\/cloudinary.com\/blog\/new_auto_quality_setting_for_content_aware_video_compression\">Content-Aware Video Compression<\/a> for more details.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>For buffering tips, check out this post: <a href=\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\"><em>How to Implement Smooth Video Buffering for a Better Viewing Experience<\/em><\/a>.<\/p>\n<h3 id=\"compare\">How Do Other Live-Streaming Protocols Compare to HLS?<\/h3> \n<p>To better understand <a href=\"https:\/\/cloudinary.com\/blog\/html5_video_tags_won_t_do_for_your_videos\">HLS<\/a>, have a look at how it stacks against the other live-streaming protocols. Below is a brief comparison of HLS and three of them.<\/p>\n<h3>HLS Versus RTMP<\/h3>\n<p>Real-Time Messaging Protocol (RTMP), also known as Flash, was developed in the mid-2000s by Macromedia for streaming audio and video. Currently, RTMP is under the auspice of Adobe as a semiopen standard.<\/p>\n<p>Previously the default streaming protocol for all delivery networks, <a href=\"https:\/\/cloudinary.com\/glossary\/rtmp-vs-rtsp\">RTMP<\/a> still remains the standard for many broadcasters, because it is the de-facto protocol for inputting video streams from a camera or encoder. However, because Adobe Flash was commonly used to play RTMP on browsers, and modern browsers retired support for Flash, RTMP is losing relevance.<\/p>\n<p>Many broadcasters use <a href=\"https:\/\/cloudinary.com\/video_api\">online video platforms (OVPs)<\/a> or hosting services, which transform video streams to HLS, causing many CDNs to retire support for RTMP.<\/p>\n<h3>HLS Versus MSS<\/h3>\n<p>Introduced by Microsoft in 2008, Microsoft Smooth Streaming (MSS) also leverages adaptive bitrates for live streaming. Since it is proprietary to Microsoft devices, adoption of MSS is limited. The platform on which it is most widely used is the Xbox One game console.<\/p>\n<h3>HLS Versus MPEG-DASH<\/h3>\n<p>Also bitrate adaptive, Moving Picture Experts Group-Dynamic Adaptive Streaming Over HTTP (MPEG-DASH) is the newest of the alternative protocols and the first HTTP-based international-streaming protocol. Thanks to this protocol\u2019s codec-agnostic approach, you can play video with it almost universally, hence its standard acceptance. MPEG-DASH supports a range of formats, including H.264, H.265, VP8\/9 and AV1.<\/p>\n<p>For a tutorial on optimizing MPEG-DASH, see this post: <a href=\"https:\/\/cloudinary.com\/blog\/video_optimization_part_ii_adaptive_bitrate_streaming_of_multiple_codecs\"><em>Video Optimization, Part II: Multi-Codec Adaptive Bitrate Streaming<\/em><\/a>.<\/p>\n<h3 id=\"basic-deploy\">How Do You Deploy Basic HLS?<\/h3> \n<p>This section describes how to deploy HLS. Before you start, ensure that the following requirements are in place:<\/p>\n<ul>\n<li>A receiver in the form of an HTML page for streaming to a browser, or a client app for streaming to a mobile device or tablet.<\/li>\n<li>A host in the form of a web server or CDN.<\/li>\n<li>A utility for encoding your video source. That utility must be able to encode video in fragmented MPEG-4 or MPEG-2 TS files with H.264 or H.265 data, and audio files as augmentative and alternative communication (AAC) or Dolby AC-3.<\/li>\n<\/ul>\n<p>For more information, check out Doug Sillars article on <a href=\"https:\/\/dougsillars.com\/2017\/10\/26\/how-hls-adaptive-bitrate-works\/\">\u201cHow HLS Adaptive Bitrate Works\u201d<\/a><\/p>\n<p><strong>Step 1: Create an HTML Page and embed video.js.<\/strong><\/p>\n<p>An easy way to get started with HLS is to embed a video player like video.js. Video.js is a lightweight player that is responsive and integrates with platforms like YouTube and Vimeo.<\/p>\n<p>Add the code below to embed video.js on your page.<\/p>\n<pre class=\"js-syntax-highlighted\"><code>&lt;head&gt;\n  &lt;link href=&quot;https:\/\/vjs.zencdn.net\/7.8.2\/video-js.css&quot; rel=&quot;stylesheet&quot; \/&gt;\n\n  &lt;script src=&quot;https:\/\/vjs.zencdn.net\/ie8\/1.1.2\/videojs-ie8.min.js&quot;&gt;&lt;\/script&gt;\n&lt;\/head&gt;\n\n&lt;body&gt;\n  &lt;video\n    id=&quot;my-video&quot;\n    class=&quot;video-js&quot;\n    controls\n    preload=&quot;auto&quot;\n    width=&quot;640&quot;\n    height=&quot;264&quot;\n    poster=&quot;MY_VIDEO_POSTER.jpg&quot;\n    data-setup=&quot;{}&quot;\n  &gt;\n    &lt;source src=&quot;MY_VIDEO.mp4&quot; type=&quot;video\/mp4&quot; \/&gt;\n    &lt;source src=&quot;MY_VIDEO.webm&quot; type=&quot;video\/webm&quot; \/&gt;\n    &lt;p class=&quot;vjs-no-js&quot;&gt;\n      To view this video please enable JavaScript, and consider upgrading to a\n      web browser that\n      &lt;a href=&quot;https:\/\/videojs.com\/html5-video-support\/&quot; target=&quot;_blank&quot;\n        &gt;supports HTML5 video&lt;\/a\n      &gt;\n    &lt;\/p&gt;\n  &lt;\/video&gt;\n\n  &lt;script src=&quot;https:\/\/vjs.zencdn.net\/7.8.2\/video.js&quot;&gt;&lt;\/script&gt;\n&lt;\/body&gt;\n<\/code><\/pre>\n<p><strong>Step 2: Configure a Web Server.<\/strong><\/p>\n<p>Configure a web server from which to serve the video stream. As mentioned previously, any normal web server can serve this purpose. During configuration, associate your file extensions with the correct MIME type to identify data.<\/p>\n<p>The following table shows which file extension is associated with which MIME type.<\/p>\n<table class=\"table table-striped table-bordered\">\n   <thead>\n      <tr>\n         <th style=\"text-align:center\">File Extension<\/th>\n         <th style=\"text-align:center\">MIME Type<\/th>\n      <\/tr>\n   <\/thead>\n   <tbody>\n      <tr>\n         <td style=\"text-align:center\">.m3u8<\/td>\n         <td style=\"text-align:center\">vnd.apple.mpegURL<\/td>\n      <tr>\n         <td style=\"text-align:center\">.ts<\/td>\n         <td style=\"text-align:center\">video\/MP2T<\/td>\n      <tr>\n         <td style=\"text-align:center\">.mp4\/.m4s<\/td>\n         <td style=\"text-align:center\">video\/mp4<\/td>\n   <\/tbody>\n<\/table>\n<p>A few tips:<\/p>\n<ul>\n<li>\n<p>To ensure compatibility, if your web server has MIME-type constraints, associate <code>.m3u<\/code> files with <code>audio\/mpegURL<\/code>.<\/p>\n<\/li>\n<li>\n<p>Be sure to optimize your files by compressing them. Since index files are often large in size and frequently redownloaded, compression makes a big difference. A good practice is to compress them before upload. Alternatively, set up real-time <code>gzip<\/code> compression on your server.<\/p>\n<p>Another issue with index files is caching. When streaming live broadcasts, index files are often overwritten. To ensure that you deliver the latest version, re-serve the index file with each request by shortening the time to live (TTL) of your files to properly cache the recent files. For video on demand, the index file stays the same so you can skip this step.<\/p>\n<\/li>\n<\/ul>\n<p>To learn about the progressive web, see this post: <a href=\"https:\/\/cloudinary.com\/blog\/media_heavy_apps_progressive_web_to_the_rescue\"><em>Media-Heavy Apps? Progressive Web to the Rescue<\/em><\/a>.<\/p>\n<p><strong>Step 3: Validate Your Streams.<\/strong><\/p>\n<p>Before streaming media to viewers, validate your streams to ensure that the files play correctly and smoothly. One way of doing that is with the Media Stream Validator, which is part of <a href=\"https:\/\/developer.apple.com\/documentation\/http_live_streaming\/about_apple_s_http_live_streaming_tools\">Apple\u2019s HTTP Live Streaming Toolkit<\/a>.<\/p>\n<p>Media Stream Validator is a CLI utility for verifying local and HTTP URL files. It produces a diagnostic report on any errors or issues found. After adding files to your stream, always run this utility or a similar one as a safeguard.<\/p>\n<p><strong>Step 4: Serve Key Files Securely Over HTTPS.<\/strong><\/p>\n<p>Depending on your content, you might wish to set up streaming over secure protocols. You can do that with the Apple <a href=\"https:\/\/developer.apple.com\/streaming\/fps\/\">FairPlay Streaming<\/a> software development kit (SDK) by directly serving files over HTTPS. Alternatively, serve media files over HTTPS, in which case you must encrypt them. You can do that with Apple\u2019s file and stream segmenter tools by setting encryption options, including periodic encryption-key changes to put a lifecycle on your media, limiting access to a certain period of time.<\/p>\n<p>Afterwards, decrypt your media files with an initialization vector. As with the keys, you can change initialization vectors periodically. For optimal protection, we recommend that you change your keys every three to four hours, and initialization vectors every 50 MB of the data that is streamed.<\/p>\n<p>To protect your keys from being stolen and avoid your encryption efforts going to waste, transfer the keys over HTTPS or another secure method. This can be a tricky task, however, so test the keys internally over HTTP first. That way, if issues surface, you can resolve them before adding HTTPS.<\/p>\n<p>Following are the preliminary requirements for setting up HTTPS key serving:<\/p>\n<h4>SSL Certificate<\/h4>\n<p>Verify that a signed SSL certificate is on your HTTPS server. If not, obtain and install a valid certificate from a paid or free provider.<\/p>\n<p>Depending on the certificate service you use, either run a certificate client, such as Certbot, or install the certificate directly. For the latter option, be sure to also install your intermediate or leaf certificate so that users can verify the root certificate.<\/p>\n<h4>Authentication Domain<\/h4>\n<p>Verify that the authentication domain for your key files matches the domain for your first playlist file. Such a setup enables you to serve your playlist file from your HTTPS server and your other files from HTTP. Since the files cannot be played correctly without the playlist, your videos are secure to an extent.<\/p>\n<p>Next, set up a way for viewers to authenticate themselves. You can do that by building a dialog or a system for storing credentials on the client device. HLS does not offer dialogs so if you pick that option, build a dialog yourself.<\/p>\n<p>For details on HTTP security, see this post: <a href=\"https:\/\/cloudinary.com\/blog\/why_isnt_everyone_using_https_and_how_to_do_it_with_cloudinary\"><em>Why Isn\u2019t Everyone Using HTTPS and How to Do It With Cloudinary<\/em><\/a>.<\/p>\n<h3 id=\"cloudinary-hls\">How Does Cloudinary Help You Set Up HLS?<\/h3> \n<p>With HLS, you create many video copies or video representations, each of which must meet the requirements of various device resolutions, data rates, and video quality. Additionally, you must do the following:<\/p>\n<ol>\n<li>Add index and streaming files for the representations.<\/li>\n<li>Create a master file that references the representations and that provides information on and metadata for the various video versions.<\/li>\n<\/ol>\n<p>That\u2019s a load of grunt work for even one video. Turn to Cloudinary, which automatically generates and delivers all those files from the original video, transcoded to either HLS or MPEG-DASH, or both of those protocols. Called \u201cstreaming profiles,\u201d that feature enables you to configure adaptive streaming processes. You can customize the default profile settings to satisfy your requirements. Once those settings are in place, Cloudinary automatically handles all the drudgery for you.<\/p>\n<p>For details on streaming profiles, see the following:<\/p>\n<ul>\n<li>The article <a href=\"https:\/\/cloudinary.com\/blog\/plug_and_play_adaptive_bitrate_streaming_with_hls_and_mpeg_dash#how_adaptive_bitrate_streaming_works\"><em>HTTP Live Streaming Without the Hard Work<\/em><\/a>\n<\/li>\n<li>The related Cloudinary documentation: <a href=\"https:\/\/cloudinary.com\/documentation\/video_player_hls_dash\"><em>HLS and MPEG-DASH adaptive streaming<\/em><\/a>\n<\/li>\n<\/ul>\n<p>Other resources are our interactive demos, our FAQ page, and the Cloudinary community forum.<\/p>\n<p>Above all, try out this superb feature yourself. Start with <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">creating a free Cloudinary account<\/a>.<\/p>\n<hr \/>\n<h2>Want to learn more about HTML5 Video Players?<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/html5_video_player\">Ultimate HTML5 Video Player Showdown: 10 Players Compared<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/html5_video_tags_won_t_do_for_your_videos\">Adaptive HLS Streaming Using the HTML5 Video Tag<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_to_get_the_most_from_the_html5_video_player\">Get More Out of HTML5 Video Tags with Cloud-Based Video Transcoding<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":22078,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[25,303,305],"class_list":["post-22077","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-asset-management","tag-video","tag-video-api"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>HTTP Live Streaming (HLS): the Good, the Bad, and the Awesome<\/title>\n<meta name=\"description\" content=\"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"HTTP Live Streaming (HLS): a Practical Guide\" \/>\n<meta property=\"og:description\" content=\"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2020-06-01T14:56:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-02-16T18:17:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8-png?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"1540\" \/>\n\t<meta property=\"og:image:height\" content=\"847\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"HTTP Live Streaming (HLS): a Practical Guide\",\"datePublished\":\"2020-06-01T14:56:50+00:00\",\"dateModified\":\"2025-02-16T18:17:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\"},\"wordCount\":7,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA\",\"keywords\":[\"Asset Management\",\"Video\",\"Video API\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2020\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\",\"url\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\",\"name\":\"HTTP Live Streaming (HLS): the Good, the Bad, and the Awesome\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA\",\"datePublished\":\"2020-06-01T14:56:50+00:00\",\"dateModified\":\"2025-02-16T18:17:15+00:00\",\"description\":\"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA\",\"width\":1540,\"height\":847},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"HTTP Live Streaming (HLS): a Practical Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"HTTP Live Streaming (HLS): the Good, the Bad, and the Awesome","description":"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide","og_locale":"en_US","og_type":"article","og_title":"HTTP Live Streaming (HLS): a Practical Guide","og_description":"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.","og_url":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide","og_site_name":"Cloudinary Blog","article_published_time":"2020-06-01T14:56:50+00:00","article_modified_time":"2025-02-16T18:17:15+00:00","og_image":[{"width":1540,"height":847,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8-png?_i=AA","type":"image\/png"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide"},"author":{"name":"","@id":""},"headline":"HTTP Live Streaming (HLS): a Practical Guide","datePublished":"2020-06-01T14:56:50+00:00","dateModified":"2025-02-16T18:17:15+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide"},"wordCount":7,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA","keywords":["Asset Management","Video","Video API"],"inLanguage":"en-US","copyrightYear":"2020","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide","url":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide","name":"HTTP Live Streaming (HLS): the Good, the Bad, and the Awesome","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA","datePublished":"2020-06-01T14:56:50+00:00","dateModified":"2025-02-16T18:17:15+00:00","description":"Learn what HTTP live streaming (HLS) is, how it works, how to deploy it, and how to automate the grunt work with Cloudinary.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA","width":1540,"height":847},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/http_live_streaming_hls_a_practical_guide#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"HTTP Live Streaming (HLS): a Practical Guide"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":""}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649723332\/Web_Assets\/blog\/HTTP-Live-Streaming_22078ba5d8\/HTTP-Live-Streaming_22078ba5d8.png?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22077","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=22077"}],"version-history":[{"count":12,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22077\/revisions"}],"predecessor-version":[{"id":36854,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/22077\/revisions\/36854"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/22078"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=22077"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=22077"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=22077"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}