HLS was designed by Apple, so Safari and iOS play .m3u8 URLs natively. Chrome, Firefox and Edge do not. On those browsers you need a JavaScript library — most commonly hls.js — that parses the playlist and feeds the video segments into a <video> element through Media Source Extensions (MSE).
| Browser | Native HLS | What you need |
|---|---|---|
| Safari (macOS / iOS) | Yes | Set video.src directly |
| Chrome / Edge | No | hls.js or similar |
| Firefox | No | hls.js or similar |
| Android Chrome | Partial | hls.js is more predictable |
<script src="https://cdn.jsdelivr.net/npm/hls.js@1/dist/hls.min.js"></script>
<video id="video" controls></video>
<script>
const video = document.getElementById('video');
const url = 'https://your-own-cdn.example.com/master.m3u8';
if (Hls.isSupported()) {
const hls = new Hls();
hls.loadSource(url);
hls.attachMedia(video);
} else if (video.canPlayType('application/vnd.apple.mpegurl')) {
video.src = url; // native HLS (Safari)
}
</script>
You can also paste a URL into the free player tester on the home page instead of writing code.
.m3u8 as application/vnd.apple.mpegurl (or audio/mpegurl), and .ts as video/mp2t.Access-Control-Allow-Origin: * (or your specific domain). This is the single most common cause of a blank player.| Symptom | Likely cause |
|---|---|
| Nothing happens, console shows CORS error | Missing Access-Control-Allow-Origin on the playlist or segments |
MANIFEST_LOAD_ERROR | Wrong URL, 403/404, expired token, or mixed content |
MANIFEST_PARSING_ERROR | The URL returns HTML (a login or error page) instead of a playlist |
| Video stalls every few seconds | Segments too large, slow origin, or missing #EXT-X-TARGETDURATION alignment |
| Live stream freezes | The playlist is no longer being refreshed, or #EXT-X-ENDLIST was added by mistake |