Live model · Netflix streaming

Why Netflix Starts Blurry, Then Gets Sharp

A stream is cut into chunks a few seconds long, each stored at several qualities, and the player picks one per chunk. At the start its buffer is empty and it knows nothing about your network, so it takes a low quality to play at once and climbs as the buffer fills. The blur is the price of starting fast.

Pressing play: the player picks every chunk

You press play on Steady 5 Mbps. The video is 30 chunks of 4 seconds, each stored at 9 rungs of quality. Before each chunk the player must pick a rung, and it knows nothing about the network yet: its buffer is empty.
StopAdaptive bitrate, buffer-based
NetworkStart-upReservoir, sCushion, s
Clock0.0 sBuffer0.0 sPickednothing yetStalled0.0 s

On screen: nothing yet

the first chunk is on its way

The ladder

Seconds of video buffered

reservoir: lowest rungcushion: the map climbs01020304050020406080seconds since you pressed playbuffer, s

What the player picked, and what the network gave

02,0004,0006,0008,000020406080seconds since you pressed playkb/s
  • network
  • chunk's rate
  • CH1 On screen
  • CH2 Network
  • CH4 Buffer
  • CH3 Cushion

Watch the Python behind this model run, line by line

How to read the stage

The picture is what's on screen; the ladder marks the rung being downloaded and the one playing. On a steady 5 Mb/s line, the first chunk comes at the bottom rung, 145 kb/s and 416 × 234, and playback starts 0.2 s after you press play. The player climbs one rung at a time and reaches 720p at chunk 7, so the first 24 seconds of video play softer than that. It never stalls.

Why start low

A chunk can't play until it has fully arrived, and an empty buffer means nothing to fall back on. A 1080p chunk at 7,800 kb/s is 31 megabits: a 5 Mb/s line needs over 6 seconds for it, staring at a spinner. The bottom rung takes 0.2 s. The player then steps up one rung after each chunk that downloads at least 8 times faster than it plays, the rule Netflix's engineers tested, until the buffer can decide.

The buffer decides

Past the start, the player reads one number: seconds of video buffered. Below the reservoir it takes the bottom rung; across the cushion a straight line maps buffer to rate; past it, the top rung. It only changes rung when that line crosses the next one, so it doesn't flicker. In Netflix's tests the buffer was 240 s, with a 90 s reservoir and a 126 s cushion. The stage shrinks it to fit two minutes.

Guessing the network, versus reading the buffer

Most players then picked from a measurement: the last chunk came at 5,000 kb/s, so ask for a bit less. When the line drops to 0.8 Mb/s, that measurement is stale. Here the throughput-based player freezes for 2.1 s; the buffer-based one, with 27 s banked, never does, at the same average rate. The paper reports 10 to 20% fewer rebuffers in Netflix's tests.

The network drops: two players, one line

Two players, one network (Drops to 0.8 Mbps at 40 s). One picks each chunk's rung from how fast the last chunk came; the other from how much video it has buffered. Both start at the bottom rung.
StopTwo players, one network
Network
Chunknone yet

Seconds of video buffered

01020304050020406080seconds since you pressed playbuffer, s

The rate each picked

02,0004,0006,0008,000020406080seconds since you pressed playkb/s

So far

PlayerAverageChunks at 720p+Frozen
Throughput-based0.0 s
Buffer-based0.0 s
  • CH2 Throughput-based
  • CH4 Buffer-based
  • CH3 Network

Watch the Python behind this model run, line by line

What the model leaves out

The ladder is Apple's recommended one; Netflix now encodes a ladder per title. Real chunks vary in size around their rung's average, the network varies within a second, and today's players blend buffer and throughput signals. The picture is 48 × 27 pixels standing in for 1080p, averaged down to each rung's resolution, so it shows the idea of a lower rung, not a real encoder's artifacts.

Questions

Why does Netflix look blurry when it starts?
The player starts at a low quality so the first chunk arrives in a fraction of a second, then steps up as its buffer fills. A sharp first chunk would be dozens of times bigger and keep you waiting.
Why does the quality drop in the middle of a show?
Your connection slowed, and the player's buffer started shrinking. Stepping down to smaller chunks keeps the buffer from running dry, which would freeze the picture. When the buffer recovers, it climbs back.
Can I force Netflix to stay in HD?
Each profile's playback settings have a data usage level: Low, Medium, High or Auto. It caps how high the player climbs, not how low it starts, and the player still adapts below that cap to avoid freezing.
What is adaptive bitrate streaming?
Storing a video at several qualities, cut into short chunks, so the player can choose a quality chunk by chunk as conditions change. HLS and DASH, the formats nearly every streaming service uses, both work this way.

More of how it works