Why Does HLS Keep Buffering? A Practical Troubleshooting Guide
Contents
What Buffering Actually Is
Two clocks run during any HLS session: the playhead consuming footage in real time, and the download frontier fetching the next chunks. The picture freezes the instant the second clock falls behind the first — the buffer has run dry. So every stall, at root, means one of these went wrong: the connection delivers bytes too slowly, an individual segment took an unusually long detour, or the player paused fetching for some other reason entirely.
A Five-Step Triage Routine
- Reproduce somewhere clean. Paste the same link into the online player. If it plays smoothly there, the fault lies in the original page or player, not the stream.
- Watch the Network panel. Filter for
.tsand eyeball load times: a single five-second request points at one bad segment; every request crawling points at bandwidth. - Measure raw throughput. A quick command tells you what the link can actually sustain:
curl -o /dev/null -s -w "%{speed_download} bytes/s\n" "https://example.com/seg-001.ts"
- Compare it to the stream's bitrate. If the video needs roughly two-thirds of what your connection can provide, stalls are inevitable — the margin is too thin for network jitter.
- Check for rejected requests. Console warnings about CORS, or 403 responses on segments, mean access rules rather than raw speed are to blame.
When the Source Is the Culprit
- Encoder lag. On live broadcasts, the packager may be producing chunks slower than viewers consume them — nothing you do client-side can fix that.
- Cache misses. Rotating query strings on segment URLs defeat CDN caching, forcing every viewer onto the origin server.
- Chunky segments. Ten-second fragments stretch startup and widen each gap between fetches; well-tuned deployments favor two to four seconds.
- Key delivery delays. AES-128 streams fetch a decryption key before playback; a slow key endpoint stalls the very first frame.
Fixes You Control as a Viewer
- Manually drop the quality one notch — halving the bitrate roughly doubles your headroom.
- Silence background bandwidth hogs: cloud sync, system updates, other tabs mid-download.
- Prefer wired or 5 GHz connections; congested 2.4 GHz Wi-Fi alone can cause periodic stutter.
- Give desktop players a bigger cushion. In VLC:
Tools → Preferences → Input / Codecs → Network caching, raised to 1000–3000 ms. - On VPNs, switch exit nodes or disconnect — a distant relay often throttles throughput badly.
The Last Resort: Play It Locally
When a stream works but only just, watching it through a browser fights the physics the whole way. Pull it down once instead and playback stops depending on the network. The M3U8 to MP4 converter handles this in-browser, and our conversion guide covers command-line alternatives for longer recordings.