{"id":21501,"date":"2017-04-10T16:35:15","date_gmt":"2017-04-10T16:35:15","guid":{"rendered":"http:\/\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience"},"modified":"2025-09-29T15:22:11","modified_gmt":"2025-09-29T22:22:11","slug":"how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","title":{"rendered":"How to Implement Smooth Video Buffering for a Better Viewing Experience"},"content":{"rendered":"<div class=\"wp-block-cloudinary-markdown \"><p>In the early days of the web, the only thing that mattered was getting that content out to users no matter how long it took or what resources it consumed. As a matter of fact, users seemed to understand and were ready to wait till whenever their browser\u2019s loading spinner stops and the contents displayed.<\/p>\n<p>Today, though, users\u2019 patience has run out.  They are no longer willing to wait because they know we \u2013 the engineers \u2013 can afford to give them a better experience.<\/p>\n<p>While web content comes in different forms, today we will focus on video. <a href=\"https:\/\/cloudinary.com\/video_api\">Video optimization<\/a> and delivery of a good viewing experience to users doesn\u2019t come easy. Yes, flash is gone and HTML5 is here to stay; but don\u2019t expect that you can just drop the video tag in your HTML and you\u2019re done.<\/p>\n<p>Let\u2019s take a look at a common approach to delivering videos, popularly known as <a href=\"https:\/\/cloudinary.com\/glossary\/buffer\">buffering<\/a>.<\/p>\n<h2>What Video Buffering Is and Why Use It<\/h2>\n<p>Most videos on the web do something that looks like a pre-fetch. You may notice the progress bar showing another indicator that is greater than or equal to the current play time. This is what <a href=\"https:\/\/www.youtube.com\/\">Youtube<\/a>\u2019s streaming looks like:<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_660\/4nFh5d1.png\" alt=\"YouTube\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"660\" height=\"421\"\/><\/p>\n<p>The light gray portion of the progress bar indicates the buffered content.<\/p>\n<p>YouTube dynamically adjusts the quality of that portion depending on the bandwidth and CPU capacity it detects. For example, if the bandwidth is poor, YouTube will pre-fetch the low-quality version of the above video. On the other hand, if the bandwidth is great, it would pre-fetch the high-quality version for rendering.<\/p>\n<p>Put this together and users have a great experience whether or not their connectivity is superb or poor.<\/p>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>The key thing to keep in mind is not the fact that the video is pre-fetched, but rather that the pre-fetching is achieved with an intelligent strategy.<\/p><\/div>\n<p>Now that we have a basic understanding of what buffering is, let\u2019s see how we can employ an intelligent strategy that entails buffering based on the bandwidth or CPU capacity conditions.<\/p>\n<h2>Meet Cloudinary\u2019s Adaptive Bitrate Streaming (HLS &amp; MPEG)<\/h2>\n<p>Cloudinary offers a game-changing concept known as adaptive bitrate streaming (ABS), which is a video delivery technique that adjusts the quality of a video stream in real time according to detected bandwidth and CPU capacity. This approach enables videos to start quicker, with fewer slow video buffering interruptions and at the best possible quality for the current device and network connection, to maximize user experience.<\/p>\n<p>Videos provisioned using ABS are provided in versions known as representations, each with different quality and <a href=\"https:\/\/cloudinary.com\/glossary\/transrating\">bitrates<\/a>. Each video file must be accompanied by an index file that specifies predefined segments of the video. Additionally, there is a master playlist that points to the available representations with additional information about each one.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/cloudinary-res.cloudinary.com\/image\/upload\/w_660\/adaptive_streaming_model.png\" alt=\"HLS\" loading=\"lazy\" class=\"c-transformed-asset\"  width=\"660\" height=\"440\"\/><\/p>\n<p>You can use this Cloudinary feature to deliver a better viewing experience for your users at no cost.<\/p>\n<p>To deliver videos using adaptive streaming, Cloudinary generates multiple copies of your video prepared at different resolutions, qualities and data rates. The copies of the videos are then automatically generated and delivered from a single original video, transcoded to either or both of the following protocols:<\/p>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/video_api\">HTTP Live Streaming (HLS)<\/a>\n<\/li>\n<li>Dynamic Adaptive Streaming over HTTP (MPEG-DASH)<\/li>\n<\/ul>\n<p>Now that we\u2019ve explained the concept, let\u2019s write some code to put the pieces of these puzzles together.<\/p>\n<h2>Uploading Videos to Cloudinary<\/h2>\n<p>Cloudinary comes fully loaded with interesting features to make managing your media files an awesome experience. These features range from being a CDN for your media files (which means you can upload and store files to Cloudinary server) to manipulating your media files (as we discussed above).<\/p>\n<p>Let\u2019s take a look at how we can upload images from our Node servers to Cloudinary. Cloudinary offers a <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_npm\">Node SDK<\/a> that facilitates image uploads so you do not have to memorize the API URLs for doing this.<\/p>\n<div class='c-callout  c-callout--inline-title c-callout--note'><strong class='c-callout__title'>Note:<\/strong> <p>SDKs for PHP, Python, Ruby and .Net are also available with the same API methods.<\/p><\/div>\n<p>Install the SDK by running:<\/p>\n<pre class=\"js-syntax-highlighted\"><span><code class=\"hljs shcb-wrap-lines\">$ npm install cloudinary --save\n<\/code><\/span><\/pre>\n<p>Import <code>cloudinary<\/code> to your code base:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">var<\/span> cloudinary = <span class=\"hljs-built_in\">require<\/span>(<span class=\"hljs-string\">'cloudinary'<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>Configure the SDK with your credentials (you can get one <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">here<\/a>):<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">cloudinary<\/span><span class=\"hljs-selector-class\">.config<\/span>({ \n  <span class=\"hljs-attribute\">cloud_name<\/span>: <span class=\"hljs-string\">'&#91;CLOUD_NAME]'<\/span>, \n  api_key: <span class=\"hljs-string\">'&#91;API_KEY]'<\/span>, \n  api_secret: <span class=\"hljs-string\">'&#91;API_SECRET]'<\/span> \n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>\u2026 then use the following few lines to upload to Cloudinary:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.uploader.upload(<span class=\"hljs-string\">'dog.mp4'<\/span>, <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">result<\/span>) <\/span>{\n  <span class=\"hljs-comment\">\/\/ Upload handler<\/span>\n  <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'result: '<\/span>, result);\n}, {\n  <span class=\"hljs-attr\">public_id<\/span>: <span class=\"hljs-string\">'my_dog'<\/span>,\n  <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">'video'<\/span>\n});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>We can request the video from Cloudinary using the public URL we specified:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.video(<span class=\"hljs-string\">'my_dog'<\/span>);\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>The output of the above will be:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml shcb-wrap-lines\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">video<\/span> <span class=\"hljs-attr\">poster<\/span>=<span class=\"hljs-string\">'https:\/\/res.cloudinary.com\/scotch.io\/video\/upload\/my_dog.jpg'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'https:\/\/res.cloudinary.com\/scotch.io\/video\/upload\/my_dog.webm'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'video\/webm'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'https:\/\/res.cloudinary.com\/scotch.io\/video\/upload\/my_dog.mp4'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'video\/mp4'<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">source<\/span> <span class=\"hljs-attr\">src<\/span>=<span class=\"hljs-string\">'https:\/\/res.cloudinary.com\/scotch.io\/video\/upload\/my_dog.ogv'<\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">'video\/ogg'<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">video<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<p>This is mind blowing! Cloudinary generates the HTML for the various formats suitable for any given browser so we do not have to worry about that. Awesome, right?<\/p>\n<h3>Transformation with Streaming Profiles and Formats<\/h3>\n<p>Cloudinary uses transformations to manipulate media files. Such manipulations include:<\/p>\n<ul>\n<li>Dimensions<\/li>\n<li>Quality<\/li>\n<li>Scaling<\/li>\n<li>Effects<\/li>\n<li>\u2026 <a href=\"https:\/\/cloudinary.com\/documentation\/image_transformations\">and much more<\/a>.<\/li>\n<\/ul>\n<p>Transformations are provided as configuration options and applied either once during upload (eager) or each time a user needs the media to be delivered (per request).<\/p>\n<p>Cloudinary also provides a collection of predefined <strong>streaming profiles<\/strong>, where each profile defines a set of representations according to suggested best practices.<\/p>\n<p>For example, the <strong>4K<\/strong> profile creates eight different representations in 16:9 aspect ratio, from extremely high quality to audio only. Alternatively, the <strong>SD<\/strong> profile creates only three representations, all in 4:3 aspect ratio. Other commonly used profiles include the <strong>HD<\/strong> and <strong>Full HD<\/strong> profiles.<\/p>\n<p>We are going to apply the streaming profile as an eager transformation to our upload logic:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">cloudinary.uploader.upload(<span class=\"hljs-string\">'dog.mp4'<\/span>, \n        <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">result<\/span>) <\/span>{<span class=\"hljs-built_in\">console<\/span>.log(result); }, \n        { <span class=\"hljs-attr\">resource_type<\/span>: <span class=\"hljs-string\">\"video\"<\/span>, \n        <span class=\"hljs-attr\">eager<\/span>: &#91;\n            { <span class=\"hljs-attr\">streaming_profile<\/span>: <span class=\"hljs-string\">\"full_hd\"<\/span>, <span class=\"hljs-attr\">format<\/span>: <span class=\"hljs-string\">\"m3u8\"<\/span> }],                                   \n        <span class=\"hljs-attr\">eager_async<\/span>: <span class=\"hljs-literal\">true<\/span>,\n        <span class=\"hljs-attr\">eager_notification_url<\/span>: <span class=\"hljs-string\">\"https:\/\/scotch.io\/upload_completed\"<\/span>,\n        <span class=\"hljs-attr\">public_id<\/span>: <span class=\"hljs-string\">\"my_dog\"<\/span>});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<ul>\n<li>We initiate a usual upload process with the SDK specifying the URL of the image we want to send to our Cloudinary server<\/li>\n<li>An eager transformation is initiated. This transformation is an array that takes a streaming profile configuration. The <code>dog.mp4<\/code> video is encoded into <strong>HLS<\/strong> format using a <strong>Full HD<\/strong> streaming profile.<\/li>\n<li>This process could take a while so we ensure that the eager transformation is <a href=\"https:\/\/cloudinary.com\/glossary\/asynchronous-video\">asynchronous<\/a> by setting <code>eager_async<\/code> to <code>true<\/code>\n<\/li>\n<\/ul>\n<h2>Embedding Videos<\/h2>\n<p>You can deliver\/embed your eagerly transformed videos using the .m3u8 (HLS) or .mpd (MPEG-DASH) file format (extension) and include the <code>streaming_profile<\/code>. You can as well provide other non-adaptive streaming-related transformation options.<\/p>\n<p>For example:<\/p>\n<pre class=\"js-syntax-highlighted\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">cloudinary<\/span><span class=\"hljs-selector-class\">.video<\/span>(\"<span class=\"hljs-selector-tag\">my_dog<\/span><span class=\"hljs-selector-class\">.m3u8<\/span>\", {<span class=\"hljs-attribute\">streaming_profile<\/span>: <span class=\"hljs-string\">\"hd\"<\/span>});\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n<h2>Final Note<\/h2>\n<p>Personally, I have avoided the responsibility of implementing such a <a href=\"https:\/\/cloudinary.com\/guides\/video\/how-can-you-use-responsive-video\">responsive video<\/a> feature in a website because of being held responsible for customer frustrations. Cloudinary made this so simple, and using the solutions was <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">free<\/a> for the <a href=\"https:\/\/cloudinary.com\/pricing\">amount of  resources<\/a> I needed.<\/p>\n<p>Using the adaptive streaming strategy is a proven technique that enables you to deliver an optimal, smooth viewing experience. This feature is just a small part of what Cloudinary <a href=\"https:\/\/cloudinary.com\/products\/image_video_technology_platform\">offers<\/a> for video and image management. To learn more, look the <a href=\"https:\/\/cloudinary.com\/documentation\">documentation<\/a> or get started <a href=\"https:\/\/cloudinary.com\/users\/register\/free\">here<\/a>.<\/p>\n<hr \/>\n<h2>Further Reading on Video Manipulation<\/h2>\n<ul>\n<li>\n<a href=\"https:\/\/cloudinary.com\/video_api\">Video Transcoding\nand Manipulation<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/top_10_mistakes_in_handling_website_videos_and_how_to_solve_them\">Top 10 Mistakes in Handling Website Videos and How to Solve Them<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/how_to_automate_compression_of_video_files_with_one_line_of_code\">How to Compress Video Size Automatically With One Line of Code<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/exoplayer_android_tutorial_easy_video_delivery_and_editing\">ExoPlayer Android Tutorial: Easy Video Delivery and Editing<\/a>\n<\/li>\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\/how_to_generate_waveform_images_from_audio_files\">How to Generate Waveform Images From Audio Files<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/with_automatic_video_subtitles_silence_speaks_volumes\">Auto Generate Subtitles Based on Video Transcript<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/auto_generate_video_previews_with_great_results_every_time\">Auto-Generate Video Previews with Great Results Every Time<\/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\/optimizing_video_with_cloudinary_and_the_html5_video_player_part_1\">Video Optimization With the HTML5 &lt;\\video&gt; Player<\/a>\n<\/li>\n<li>\n<a href=\"https:\/\/cloudinary.com\/blog\/converting_android_videos_to_animated_gif_images_with_cloudinary_a_tutorial\">Converting Android Videos to Animated GIF Images With Cloudinary: A Tutorial<\/a>\n<\/li>\n<\/ul>\n<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":41,"featured_media":21502,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[134,305,311],"class_list":["post-21501","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guest-post","tag-video-api","tag-video-transcoding"],"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>How to Improve Live Streaming using Smooth Video Buffering<\/title>\n<meta name=\"description\" content=\"Learn how Cloudinary&#039;s adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.\" \/>\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\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Implement Smooth Video Buffering for a Better Viewing Experience\" \/>\n<meta property=\"og:description\" content=\"Learn how Cloudinary&#039;s adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-04-10T16:35:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-09-29T22:22:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"770\" \/>\n\t<meta property=\"og:image:height\" content=\"424\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\"},\"author\":{\"name\":\"\",\"@id\":\"\"},\"headline\":\"How to Implement Smooth Video Buffering for a Better Viewing Experience\",\"datePublished\":\"2017-04-10T16:35:15+00:00\",\"dateModified\":\"2025-09-29T22:22:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\"},\"wordCount\":11,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA\",\"keywords\":[\"Guest Post\",\"Video API\",\"Video Transcoding\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2017\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\",\"url\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\",\"name\":\"How to Improve Live Streaming using Smooth Video Buffering\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA\",\"datePublished\":\"2017-04-10T16:35:15+00:00\",\"dateModified\":\"2025-09-29T22:22:11+00:00\",\"description\":\"Learn how Cloudinary's adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.\",\"breadcrumb\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA\",\"width\":770,\"height\":424},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Implement Smooth Video Buffering for a Better Viewing Experience\"}]},{\"@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":"How to Improve Live Streaming using Smooth Video Buffering","description":"Learn how Cloudinary's adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.","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\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","og_locale":"en_US","og_type":"article","og_title":"How to Implement Smooth Video Buffering for a Better Viewing Experience","og_description":"Learn how Cloudinary's adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.","og_url":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","og_site_name":"Cloudinary Blog","article_published_time":"2017-04-10T16:35:15+00:00","article_modified_time":"2025-09-29T22:22:11+00:00","og_image":[{"width":770,"height":424,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience"},"author":{"name":"","@id":""},"headline":"How to Implement Smooth Video Buffering for a Better Viewing Experience","datePublished":"2017-04-10T16:35:15+00:00","dateModified":"2025-09-29T22:22:11+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience"},"wordCount":11,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","keywords":["Guest Post","Video API","Video Transcoding"],"inLanguage":"en-US","copyrightYear":"2017","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","url":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience","name":"How to Improve Live Streaming using Smooth Video Buffering","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","datePublished":"2017-04-10T16:35:15+00:00","dateModified":"2025-09-29T22:22:11+00:00","description":"Learn how Cloudinary's adaptive bitrate streaming can enhance slow video buffering and improve live streaming quality according to your bandwidth and CPU capacity.","breadcrumb":{"@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","width":770,"height":424},{"@type":"BreadcrumbList","@id":"https:\/\/cloudinary.com\/blog\/how_to_implement_smooth_video_buffering_for_a_better_viewing_experience#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Implement Smooth Video Buffering for a Better Viewing Experience"}]},{"@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\/v1649748386\/Web_Assets\/blog\/Smooth_Video_Buffering\/Smooth_Video_Buffering.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21501","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=21501"}],"version-history":[{"count":15,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21501\/revisions"}],"predecessor-version":[{"id":38650,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/21501\/revisions\/38650"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/21502"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=21501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=21501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=21501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}