Back to Blog

Why Video Quality Changes Mid-Playback: Adaptive Bitrate Streaming Explained

Adaptive bitrate streaming (ABR) is the logic that picks a quality level your connection can sustain. Plain-English guide to how YouTube, Netflix, and Twitch pick what to send you next.

By

You’re halfway through a YouTube video and the picture suddenly drops from sharp to fuzzy. A few seconds later it climbs back up. You didn’t touch any controls. The Wi-Fi icon in the corner looks fine. What just happened?

You watched an adaptive bitrate streaming algorithm doing its job in front of you. Behind every modern streaming player is a quiet loop measuring your network, comparing the numbers to a menu of pre-encoded quality variants the service has on offer, and silently switching between them whenever the math says to. When your connection wobbles, the player swaps to a smaller variant so playback doesn’t stall. When the connection recovers, it climbs back. Most of the time you don’t notice. The times you do notice are the times the switch was big enough to see.

Adaptive bitrate streaming (ABR) is the technique modern players use to switch between pre-encoded quality variants of the same video — picking the highest variant your connection can sustain on each segment — so playback keeps flowing through messy real-world networks.

This guide walks through what’s actually happening when quality shifts mid-playback: how services encode multiple variants of the same title, how the player measures bandwidth and decides what to fetch next, why the algorithms have names like BOLA and MPC, where you encounter ABR in the real world, and what it means if you ever want to save a video that’s playing this way.

Key Takeaways

  • ABR is the bitrate-switching logic inside an adaptive streaming player. Adaptive streaming is the broader pattern (HLS, DASH); ABR is the specific algorithm that picks which variant to fetch next.
  • Services pre-encode each title at multiple bitrates — an “encoding ladder” like 1080p@5Mbps, 720p@2.8Mbps, 480p@1.4Mbps, 360p@800Kbps. The manifest exposes the whole ladder to the player.
  • Switching happens at segment boundaries, not mid-segment. Every 2 to 10 seconds the player can pick a different variant. It cannot change variant in the middle of a segment.
  • Bandwidth estimation is harder than it sounds. Players use throughput from the last few segment downloads, buffer level, or both — algorithms like BOLA, MPC, and dynamic combine these signals.
  • Cold starts are conservative on purpose. With no bandwidth history, the player picks a low variant so playback starts fast; it climbs once it has real measurements.
  • Live ABR is the same model with tighter buffers. Live players run smaller buffers and accept lower variants because falling behind the live edge is worse than dropping a quality notch.
  • Saving an ABR stream means picking one variant on purpose. When the player switches mid-playback, the bytes on your disk would be a stitched-together hybrid — useless as a clean copy.

The Simple Explanation

Imagine you’re driving on a road with traffic. You can’t always go 80 — sometimes 50, sometimes a crawl. You don’t pick one speed and stick with it; you constantly check the road ahead and adjust. ABR is your video player constantly checking the “speed” of your internet and switching to a quality level the connection can sustain right now.

The road analogy holds up well. A streaming service has already encoded the same title at half a dozen different “speeds” — quality variants ranging from a tiny 360p stream up to a hefty 4K HDR one. The player has the full menu in hand. Every few seconds, it asks: how much bandwidth do I have right now, how full is my buffer, and which variant should I pull next?

From a viewer’s seat this hides a lot of work. Smooth fallback when Wi-Fi wobbles — the player drops one or two rungs down the ladder before the buffer runs dry, so you see a brief quality dip instead of a spinning loading icon. Recovery when bandwidth opens back up — the player climbs back over the next few segments. A quality “cold start” that sometimes feels jarringly low for the first 10 seconds — that’s the player being deliberately conservative until it knows what your connection can actually do.

The point is not to find the highest quality and hold it. The point is to never let playback stall. ABR is, fundamentally, a reliability technique with a side effect of picking the best quality it can get away with. The whole design assumes the internet is messy and the connection between you and the CDN will misbehave — and that assumption is what makes streaming work at all over real-world networks. If you want where this fits in the bigger streaming pipeline, the sibling article covers it end to end.

How ABR Actually Works

An ABR player runs a tight loop on every segment: measure bandwidth, estimate what’s sustainable, pick a variant, fetch, decode, repeat. Each step has decades of real engineering behind it, but the loop itself is small.

The Encoding Ladder

Before any video reaches a CDN, the service pre-encodes the same title at multiple bitrate-resolution combinations. The set of variants is called the encoding ladder, and a typical web ladder looks something like this:

ResolutionBitrateCodec
1920x10805.0 MbpsH.264
1280x7202.8 MbpsH.264
854x4801.4 MbpsH.264
640x3600.8 MbpsH.264
426x2400.4 MbpsH.264

A premium service might double the rungs — a 4K HDR variant at the top, an AV1 or H.265 ladder running in parallel with H.264 for newer clients, plus separate audio-only renditions. Every variant is the same source content, encoded independently at a different quality target. Different ladders can also include different codecs in different variants so newer devices get the more efficient encode while older devices get the H.264 fallback.

The Manifest Exposes the Ladder

The player learns about the ladder by fetching a manifest — a small text file the service serves at the start of playback. The two dominant manifest formats describe the same ladder concept in different syntax. In HLS, the master playlist uses one #EXT-X-STREAM-INF line per variant:

#EXTM3U
#EXT-X-VERSION:6
#EXT-X-STREAM-INF:BANDWIDTH=5000000,RESOLUTION=1920x1080,CODECS="avc1.640028,mp4a.40.2"
1080p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2800000,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2"
720p/index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1400000,RESOLUTION=854x480,CODECS="avc1.4d401e,mp4a.40.2"
480p/index.m3u8

In DASH, the same information lives inside a Representation element nested in an AdaptationSet, with bandwidth, width, height, and codecs attributes. Different syntax, same job — see how the HLS master playlist exposes variants and how DASH defines variants via Representation for the side-by-side details. Either way, the player ends up with a list of variants, each with a declared bandwidth and a URL to a more detailed media playlist or segment template.

Bandwidth Estimation

The player can’t ask the network how much capacity it has. It has to infer. Two signals dominate:

  • Download-time-based estimation measures how many bytes arrived and how long they took for the last few segments. A 6 MB segment that took 2 seconds suggests ~24 Mbps of throughput; a rolling average — often the harmonic mean of the last 3 to 5 downloads — smooths out single noisy samples.
  • Buffer-level-based estimation watches the buffer. If the buffer is growing, the network is outrunning playback comfortably. If it’s shrinking, the network is losing the race even when raw throughput looks fine — maybe the next segment is sitting in a slow CDN queue.

Modern players use both. Pure throughput estimation reacts to fast network changes but can over-react to a single slow segment; pure buffer-based estimation is stable but slow to react. Blending them gives the player a signal that’s both fast and well-behaved.

The Switching Algorithm

Once the player has a bandwidth estimate, it has to translate that into a variant choice. A few named algorithms dominate the field:

  • Throughput-based (the original approach) — pick the highest variant whose declared bandwidth fits inside your safety-margin-adjusted estimate. Simple, fast, sensitive to noise.
  • BOLA (Buffer Occupancy-based Lyapunov Algorithm) — a buffer-based algorithm published in 2016 that decides based on how full the buffer is. While the buffer is healthy, BOLA holds the current variant; only when the buffer dips does it step down. This avoids needless quality oscillation on a noisy network.
  • MPC (Model Predictive Control) — a hybrid that combines throughput estimates, buffer level, and a cost function for switching itself, then picks the variant that minimizes expected stalls plus visible quality changes over a short prediction horizon.
  • dash.js dynamic — the open-source dash.js player’s default, which blends throughput and buffer signals and adjusts based on recent network behavior.

The differences matter on flaky connections. A throughput-only algorithm watching a single slow segment might panic and drop two rungs; BOLA might hold steady because the buffer is still fine. Engineering taste varies; most production players ship a tuned variant of MPC or a dynamic hybrid.

Switching Happens Between Segments

The player can’t change variant mid-segment. Once it has started downloading segment042.ts from the 1080p variant, that whole segment is locked in — even if the network suddenly slows to a crawl, switching to 480p happens at segment043 at the earliest. This is why segment length is a real tuning parameter: shorter segments (2 seconds) give the player more chances to switch and react faster to network changes, but mean more HTTP requests and more overhead. Longer segments (10 seconds) are more efficient but make ABR slower.

Cold Start vs Steady State

At the moment you press play, the player has no bandwidth history. The first variant choice is essentially a guess. Most players guess conservatively — they pick the lowest or near-lowest variant so playback starts fast without risking an immediate stall. Once the first one or two segments arrive, the player has real download timings and can climb. This is why the first few seconds of a video often look noticeably worse than the rest: it’s the ABR cold start working as designed. Some services start with a hint from previous session bandwidth or network type, but conservative cold-starting remains the default.

Live vs VOD ABR

Live streams run the same ABR loop with one critical difference: the buffer can’t grow without bound. A VOD player can comfortably buffer 30 to 60 seconds ahead. A live player buffers maybe 5 to 15 seconds — beyond that, you’re falling further behind the live edge. The smaller buffer forces ABR to react faster and accept lower variants more readily, because there’s less headroom to absorb a bad segment. Low-latency HLS and DASH push this further with chunk-based delivery, giving the player even thinner buffers to work with.

Each of these decisions is what the player would do for you if you just pressed play. If you instead want to walk away with a clean file, you’re going to have to make some of these decisions yourself — and that’s where VidMost comes in, parsing the manifest and picking the right variant once instead of switching constantly.

Where You See ABR in the Real World

Every major streaming service in 2026 runs ABR; the differences are in tuning, not in whether to do it.

  • YouTube shows ABR most visibly. The quality menu offers “Auto” plus a list of specific variants. Auto is ABR running with YouTube’s hybrid algorithm; picking a specific variant manually pins the player to that one and disables the safety net. The Network tab in your browser dev tools shows segment requests from whichever variant the algorithm picked at that moment.
  • Netflix runs one of the most-studied ABR stacks in the industry, paired with content-aware encoding. Instead of using a one-size-fits-all ladder, Netflix tunes each title’s ladder to its content — a low-motion drama gets a different rung set than a fast action film, because the encoder needs fewer bits to hit the same perceptual quality. The result is a ladder optimized per title.
  • Twitch, Bigo Live, and other live platforms run aggressive low-buffer ABR to keep latency low. The player accepts a smaller buffer and quicker variant drops because a 30-second buffer in a live chat context means you’re 30 seconds behind the action. Streamers and viewers both notice.
  • Mobile vs desktop behave differently. Mobile players typically start lower and climb more slowly because Wi-Fi and cellular networks are less predictable than wired connections. Desktop and TV players assume stable connectivity and climb faster.
  • Apple TV and smart TVs are usually most aggressive about climbing. They assume stable Wi-Fi or wired Ethernet and don’t bother being defensive. This is why a Netflix stream on the TV often looks sharper than the same title on a laptop — the algorithm started higher and climbed faster.
  • VR and 360-degree streaming push ABR limits in a new direction. A 360-degree video has way more pixels than a flat one, but you only look at a small viewport at any given moment. Tile-based ABR breaks the panorama into tiles and streams the tile you’re looking at in high quality while keeping the rest low — a different problem from classic ABR, but the same encode-multiple-variants-and-pick philosophy.

Beyond consumer services, the hosted video providers — Cloudflare Stream, Mux, Bitmovin, JW Player, Vimeo — ship ABR-enabled players as the default. If a website embeds a video from one of those services, ABR is happening even if no one mentioned it.

What This Means If You Want to Save a Video

Here’s where ABR creates a problem that surprises people. When you watch a stream at “Auto,” the browser’s network tab shows a mixed download — some segments came from the 1080p variant, some from the 720p variant, maybe a brief detour through 480p when your Wi-Fi blinked. The bytes that actually hit your disk while you watched are a stitched-together hybrid of multiple variants. Saving “what you watched” is impossible because what you watched wasn’t a single thing.

To get a clean, consistent-quality copy you have to pick one variant on purpose and fetch only that variant’s segments. That means parsing the manifest, identifying the highest-bandwidth variant available, and bypassing the ABR loop entirely — never asking it to switch, just downloading every segment from the top rung. Browser extensions and “right-click save” don’t do this. They either save the manifest text file (a recipe with no ingredients) or capture whatever segments the player happened to fetch, which is the hybrid mess you don’t want.

VidMost handles this directly. It reads the manifest, picks the highest-bandwidth variant the service offers, and downloads consistent-quality segments from that one variant — so you end up with the full 1080p (or 4K, when available) version of the title, not a 480p slice from the moment your Wi-Fi flickered. For DRM-protected content the encoding ladder is still there; the keys are just gated behind a license server. VidMost’s built-in Widevine L3 support works wherever L3 playback is available — though the actual ceiling is set by the service and DRM level, and premium platforms like Netflix or Disney+ commonly cap L3 streams at 480p–720p regardless of what the ABR ladder offers.

Common Pitfalls and Misconceptions

A handful of misconceptions about ABR show up in forum threads over and over. Worth clearing up.

  • “Higher bandwidth means better quality.” Only if your bandwidth is stable. A spiky 100 Mbps connection that drops to 1 Mbps for two seconds every minute is worse for ABR than a steady 5 Mbps line, because the algorithm spends its time reacting to noise instead of holding a high variant. Stability matters more than peak speed.
  • “Switching always causes buffering.” It doesn’t. Modern players switch between variants invisibly at segment boundaries — you see a quality shift, not a stall. The spinner only appears when the buffer ran out faster than the next segment could arrive, which is what ABR is specifically trying to prevent.
  • “ABR is the same as adaptive streaming.” Close but not identical. Adaptive streaming is the broader pattern — manifest, segments, HTTP delivery — embodied by HLS and DASH. ABR is specifically the bitrate-switching logic inside an adaptive streaming player. Every HLS or DASH player runs an ABR algorithm; adaptive streaming is what makes it possible, ABR is what does the choosing.
  • “I can override ABR by setting quality to 1080p manually.” You can, but it disables the safety net. On a flaky connection, locked-1080p means rebuffers every time the network can’t sustain the bitrate. ABR exists because the network is unreliable; pinning quality doesn’t fix the network, it just makes the consequences visible.
  • “Buffer is wasted bandwidth.” No. A 30-second buffer is what keeps you watching through a 20-second Wi-Fi blip. The buffer is the algorithm’s safety margin, and the difference between a healthy stream and a frustrating one usually comes down to whether the buffer was deep enough to absorb a transient network problem.

Closing Thoughts

ABR is one of those technologies that disappears when it works. You notice it only when a quality shift is big enough to see, or when the buffer runs dry and the spinner shows up. Most of the time it’s running silently — measuring, deciding, switching — between every pair of segments your player fetches.

Once you can recognize the encoding ladder in a manifest and the bandwidth-decide-fetch loop a player runs on each segment, a lot of streaming behavior stops being mysterious. The cold-start blur is a deliberate conservative guess. The mid-playback quality jumps are the player avoiding a stall. The reason saving a “what I watched” copy is hard is because what you watched was never one thing in the first place.

If you’d rather skip the protocol layer entirely and just save the highest-quality variant in one go, VidMost parses the manifest, picks the top rung, and downloads it clean.

Related reading

Frequently Asked Questions

What is adaptive bitrate streaming?
Adaptive bitrate streaming (ABR) is the technique modern video players use to switch between pre-encoded quality variants of the same video while you watch. The server hosts the title at several bitrates — say 1080p at 5 Mbps, 720p at 2.8 Mbps, 480p at 1.4 Mbps. The player measures your bandwidth and buffer level and picks the highest variant your connection can sustain for each new segment. When the network changes, the player swaps to a different variant at the next segment boundary without restarting playback.
Why does my YouTube video quality keep changing?
When YouTube is set to Auto, an ABR algorithm is running. The player downloads short segments of video, measures how fast they arrive, and picks the best variant your connection can keep up with. If your Wi-Fi briefly slows down, the next segment is fetched from a lower-quality variant; once the connection recovers, the player climbs back. The visible quality jump you see is the player avoiding a buffer underrun. Locking quality to 1080p manually disables this safety net, so a flaky connection will rebuffer instead.
Why does video start blurry and get sharper?
At the start of playback the player has no bandwidth history. It picks a conservative variant so it can start fast without risking an immediate stall. As the first few segments arrive, the player measures real download times, realizes it has more bandwidth than it assumed, and switches to a higher variant at the next segment boundary. The first 5 to 15 seconds of a video are often the worst-looking part of the stream — this is the ABR cold start, not a problem with the source.
Can I disable adaptive streaming?
Sort of. Most player UIs — YouTube, Netflix's developer options, Twitch — let you pin the quality to a specific variant. That tells the ABR logic to stop choosing on your behalf. The trade-off is real: if you lock to 1080p on a connection that can only sustain 720p, you'll see rebuffers every time the buffer drains. ABR exists because the network underneath is unreliable; turning it off doesn't make the network more reliable, it just makes the player more honest about the consequences.
Why does Netflix pick a lower quality than my internet can handle?
Netflix's ABR is conservative on purpose. The algorithm weighs your measured throughput, your buffer level, and a safety margin for jitter; it also caps the maximum bitrate based on your DRM security level. On a Widevine L3 desktop browser, Netflix won't deliver above 720p no matter how fast your connection is. Netflix's content-aware encoding also tunes each title's ladder individually — a low-motion drama may top out at a lower bitrate than an action film because the encoder doesn't need more bits to hit the same perceptual quality.
Is buffering the same as ABR switching?
No, though they're related. ABR switching is invisible — the player swaps to a different variant at the next segment boundary and you keep watching, maybe at a different sharpness. Buffering is what you see when the buffer runs empty before the next segment arrives; playback stops while the player waits. Modern ABR is designed precisely to avoid buffering by stepping down to a smaller variant before the buffer drains. When you do see the spinner, it usually means the network dropped faster than the algorithm could react.
Why does the first few seconds always look bad?
Because the player has no bandwidth data at the moment you press play, so it picks a low variant to start fast. The alternative — picking 1080p optimistically and stalling for ten seconds while the buffer fills — is much worse user experience. Most ABR algorithms intentionally cold-start at the lowest or near-lowest variant and climb within the first few segments. Some services use prior session data or signal-strength hints to start higher, but a conservative cold start remains the default for good reason.
Does ABR work on live streams?
Yes, with tighter constraints. Live ABR runs on the same encoding-ladder, manifest, segment model as VOD, but it operates with a much smaller buffer — sometimes just a handful of seconds — because piling up buffer means falling behind the live edge. That forces the algorithm to react faster and accept lower quality when the network wobbles. Low-latency HLS and DASH variants use partial segments and chunk-based delivery to keep the buffer thin without making ABR decisions slower or worse.