β Progressive Download is not a different protocol but rather how browsers progressively download and play video using HTTP Range Requests.
- When the browser encounters a
<video>tag, it will:- Send requests with
Rangeheader to get a byte segment of the file - Server returns HTTP 206 Partial Content with that data portion
- Browser buffers and plays immediately while continuing to download
- Send requests with
π Progressive Download: fetch by range to play immediately without waiting for the entire file to download.
- Browser sends HTTP Range Requests to download video in parts
- Any server returns HTTP 206 Partial Content for requested segments
<video>tag progressively loads and plays, allowing seeking to the middle of the video
π Progressive Download is not a new protocol, just HTTP + range requests for video serving. β No need for custom server if current server supports HTTP Range (Nginx, http-server, Express static, MinIO, S3, CDN all support it).
π Whether local file or HTTP, browser still sends range requests and handles progressive download automatically.
Custom server to return video file by range request:

Video tag + local file still supports range request:

Progressive Download doesn't require a "custom server" - it's simply using HTTP Range to download video in parts. The server can be any HTTP server that supports Range (static server, S3, MinIO, CDN, Express, Nginx,...)
HLS is a popular video streaming protocol that divides video into small .ts segments and uses .m3u8 playlist files for management.
β HLS doesn't require downloading the entire video before playing β it downloads in chunks (segments) and the player can start playing immediately when enough data from the first chunks is available. This is the core principle of HLS streaming over HTTP.
π HLS divides video into small segments (e.g., each ~5-10 seconds). These segments are listed in the .m3u8 playlist. When the player starts:
- Player downloads the playlist (.m3u8) first β knows the list of segments to load
- Player only downloads the first few segments for buffering, then plays immediately β no need to download the entire large video file first
- While playing, player downloads the next segment in sequence β each segment is loaded separately via HTTP GET β streams in small chunks
πΉ Progressive download loads byte ranges within the same MP4 file using Range requests. β Browser can start playing when the first portion has enough buffer.
πΉ HLS loads small segment files, doesn't wait for the entire video to be on the client, because the player only needs the first few segments. β HLS has a more structured approach for adaptive bitrate, live streaming, seeking, and fast-forwarding.
π This is why you see:
β HLS video starts playing almost immediately β In DevTools you see each segment loaded separately (.ts files) β Player doesn't download the entire video before playing β it streams in chunks like true streaming
β± This helps:
- Reduce video startup time
- Only load necessary data
- Enable adaptive bitrate (load appropriate quality)
- Work efficiently with live streaming or video on demand
π§ Summary
π HLS supports playback immediately when only the first few segments are loaded π Doesn't "wait for the entire video to download" π Player continuously downloads the next segment while playing π This is the characteristic of adaptive, chunk-based streaming β traditional progressive download
ffmpeg -i ubuntu_installation.mp4 -c:v libx264 -c:a aac -b:a 128k -f hls -hls_time 10 -hls_list_size 0 hls/ubuntu_installation/master.m3u8This command will create:
- 1 playlist
master.m3u8 - Segment
.tsfiles in thehls/ubuntu_installationdirectory
ffmpeg -i ubuntu_installation.mp4 \
-vf "scale=1920:-2" -c:v libx264 -b:v 5000k -c:a aac -b:a 192k \
-hls_time 10 -hls_playlist_type vod \
-hls_segment_filename "hls/ubuntu_installation/1080p_%03d.ts" \
hls/ubuntu_installation/1080p.m3u8 \
-vf "scale=1280:-2" -c:v libx264 -b:v 2500k -c:a aac -b:a 128k \
-hls_time 10 -hls_playlist_type vod \
-hls_segment_filename "hls/ubuntu_installation/720p_%03d.ts" \
hls/ubuntu_installation/720p.m3u8 \
-vf "scale=854:-2" -c:v libx264 -b:v 1200k -c:a aac -b:a 96k \
-hls_time 10 -hls_playlist_type vod \
-hls_segment_filename "hls/ubuntu_installation/480p_%03d.ts" \
hls/ubuntu_installation/480p.m3u8http-server ./hls/ubuntu_installation -p 8080 --corsIn the frontend, simply call the master.m3u8 file. The browser will:
- Read the master playlist content
- Select appropriate quality based on internet connection
- Automatically download and play segments
β Both HLS and Progressive Download allow fast startup without waiting for the entire video to download.
- Progressive Download: Loads byte ranges within a single file β starts when buffer is sufficient
- HLS: Loads small segments β starts when first few segments are ready
β‘ But HLS usually starts faster and is more optimized, because the player only needs to load a few short segments instead of ranges within a large file.
π This is HLS's biggest advantage:
πΈ HLS supports Adaptive Bitrate Streaming (ABR)
- HLS has a master playlist listing different qualities
- Player automatically switches to appropriate quality based on bandwidth (reduces stuttering/buffering when network is weak)
πΈ Progressive Download doesn't support Adaptive
- Only has 1 quality in 1 MP4 file
π Conclusion: If network is unstable or you want to optimize UX for multiple devices, HLS is better than Progressive.
πΉ HLS only loads segments that users actually watch β If user only watches 1/3 of video, only the first few segments are loaded β saves bandwidth.
πΉ Progressive Download gradually loads the entire file even if user doesn't watch it all β potential bandwidth waste.
πΉ HLS small segments help CDN cache efficiently, serving multiple users simultaneously better.
β HLS is widely used in real streaming systems, especially with CDN β because:
- Player can load segments from different edge servers
- Easy to distribute to millions of users globally
While Progressive Download is a simpler technique, good for small content or single-viewer environments.
β Progressive Download is not suitable for live streaming β HLS supports live streaming by continuously providing new playlists and segments while video is playing.
π If you want to stream live events (live events, cameras...), HLS is the clear choice.
β Progressive Download is very simple: just HTTP server and standard MP4 file β HLS requires additional steps: create segments + playlist, then set up server to serve segment directory
π HLS is slightly more complex, but the superior benefits β adaptive, CDN, live β make it the current standard method.
| Feature | Progressive Download | HLS (HTTP Live Streaming) |
|---|---|---|
| File Structure | Single MP4 file | Multiple small .ts segments + .m3u8 playlist |
| Adaptive Bitrate | β Not supported | β Supported - Multiple qualities, auto-switch |
| Live Streaming | β Not supported | β Supported - Perfect for live events |
| CDN Compatibility | β Excellent - Segment-based caching | |
| Startup Speed | β Fast | β Faster - Only needs first few segments |
| Scalability | β Excellent - Handles millions of users | |
| Seek/Scrubbing | β Supported | β Supported - Better with segments |
| Setup Complexity | β Simple - Just HTTP server | |
| Network Recovery | β Better - Can adapt quality | |
| Storage Requirements | β Single file |
- β Unstable user networks - Adaptive bitrate prevents buffering
- β Large-scale distribution - Serving many users across countries
- β Quality adaptation - Automatic quality switching based on bandwidth
- β Live streaming support - Perfect for live events and real-time content
- β CDN optimization - Efficient bandwidth usage and global distribution
- β Simple projects - Small video files, straightforward implementation
- β Single quality - No need for adaptive bitrate features
- β Limited audience - Not requiring CDN distribution
- β Basic functionality - Just need video to play reliably
progressive-download.html- Examples of progressive download (server-based and local file)hls-basic.html- Basic HLS player with automatic quality selectionhls-quality-selector.html- HLS player with manual quality selection control




