← Swarmify Blog

M3U8 Player: 10 Free Options and Our Playback Tests

We checked M3U8 playback on Linux and Android, plus native browser playback in headless Windows, and compared two untested alternatives.

Adam Binst · May 23, 2019 · Updated October 28, 2026 · 13 min read
Illustrated laptop displaying a video player and playlist

TL;DR: Start with VLC for desktop M3U8 playback. On Android, Chrome played our public H.264/AAC sample after tapping Play. Headless Windows Edge and Chrome also played it in a native HTML video element. For a website, use an HTML5 player with suitable HLS support: a bare <video> tag is not universal. For a public browser test, Livepush played our sample; for private links, use a local player.

An .m3u8 file is a playlist, not the video itself. It points to the media a player needs to fetch. If you are choosing video hosting for business, the website-player section below explains how to give visitors playback without a separate app.

Below are 10 free M3U8 playback options across desktop, mobile, and browser environments.

What Is an M3U8 File?

ℹ️ What is an M3U8 file? An M3U8 file is a UTF-8 encoded playlist used by the HTTP Live Streaming (HLS) protocol. It tells a player where to find the media segments that make up a stream (RFC 8216, 2017).

When you stream a video using HLS, the server makes the video available as segments rather than one giant file. Segment duration varies by stream; the playlist records each segment’s duration.

The M3U8 file acts as the table of contents. It provides a list of URLs pointing to those specific chunks in order. When your player reads the M3U8 file, it downloads and plays those chunks sequentially, creating a continuous viewing experience.

This is also how adaptive bitrate streaming works. A “master” M3U8 file contains links to several other M3U8 files, each representing a different quality level (like 1080p, 720p, and 480p). The player monitors your internet connection and automatically switches between these playlists to prevent buffering.

Playback Results at a Glance

VLC is a desktop starting point; Livepush is a browser path we checked with a public URL. The first eight options played our sample on Linux. We also checked Chrome on Android and native browser video playback in headless Windows. The last two are documented alternatives we did not test.

OptionPlatform or settingResult or use
1. VLCHeadless Linux command linePlayed; separate sessions selected low and high quality.
2. mpvCommand linePlayed; selected video track changed from 320×184 to 1920×1080 while the clock continued.
3. ffplayCommand linePlayed; separate runs selected different qualities.
4. hls.jsLocally hosted page in ChromiumPlayed; code changed the picture from 320×184 to 1920×1080.
5. LivepushChromiumPlayed; menu clicks changed the decoded picture dimensions.
6. IPTVnatorLinux IPTV appPlayed; the picture remained 512×288 after selecting 1080p.
7. Native browser playback without an extensionLinux Chromium and headless Windows Edge/Chrome video elements; Android Chrome direct URLPlayed without a library or extension in these checks; Windows GUI playback was not tested.
8. Native HLS PlaybackChromium extensionPlayed the embedded video at 1280×720.
9. IINAMacNot tested; macOS desktop alternative.
10. SafariMac, iPhone, and iPadNot tested; provider-page playback alternative.

Eight M3U8 Playback Options We Tested on Linux

The numbers organize the list rather than rank playback speed. Choose by device and task, whether watching an authorized stream or investigating a video bitrate issue.

1. VLC Media Player

VLC is a free, open-source, cross-platform media player that opens local playlists and network streams. It requires installation, unlike a browser-based test.

Our Linux playback check used headless cvlc, not the graphical interface. These menu steps are documented in VideoLAN’s network-stream instructions; we did not test the menus:

  1. Open VLC and click Media > Open Network Stream on Windows or Linux (or press Ctrl+N). On macOS, use File > Open Network.
  2. Paste your M3U8 URL into the network URL field.
  3. Click Play to open the stream.
  4. If you have a local .m3u8 file instead, drag and drop it directly into the VLC window.

2. mpv

mpv is a free player for people comfortable opening a stream from the command line. For example:

mpv 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8'

Unlike VLC’s network-stream menu, this path starts with a terminal command.

3. ffplay

ffplay, part of FFmpeg, is another free command-line option:

ffplay 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8'

Choose VLC if you prefer opening a network stream through a graphical menu.

4. hls.js on a Locally Hosted Page

hls.js is a developer integration that loads HLS media into an HTML video element. Our locally hosted Chromium page changed quality programmatically, not through a viewer menu. Consult the repository for integration instructions (accessed 2026).

To try a minimal integration, download or build the hls.js 1.6.13 distribution from the repository and place its hls.min.js file alongside this HTML page. Serve both files over HTTP or HTTPS, and use a browser with native HLS support or Media Source Extensions supported by hls.js. The stream server must permit cross-origin requests for the playlist and media.

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>HLS playback</title>
</head>
<body>
  <video id="video" controls></video>
  <script src="hls.min.js"></script>
  <script>
    const video = document.getElementById('video');
    const source = 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8';

    if (video.canPlayType('application/vnd.apple.mpegurl')) {
      video.src = source;
    } else if (Hls.isSupported()) {
      const hls = new Hls();
      hls.loadSource(source);
      hls.attachMedia(video);
    }
  </script>
</body>
</html>

Browsers without either playback path cannot play this example.

5. Livepush HLS Player

Livepush offers a free online M3U8 testing tool. Paste a public test URL and click Play m3u8. In our check, actual low- and high-quality menu selections changed the decoded picture dimensions.

It is a testing tool rather than a daily viewer. Do not submit private or token-bearing URLs to a third-party tester.

6. IPTVnator

IPTVnator is a free, open-source IPTV application for Windows, Mac, and Linux. Its documentation lists M3U/M3U8 playlist import, XMLTV EPG support, and favorites. For an IPTV app, check playlist import, favorites, and guide navigation with an authorized channel list—not only a single video URL.

The 512×288 picture observed after choosing 1080p was a result for our single fixture, not evidence of a general defect.

7. Native Browser Playback Without an Extension

On Linux, our plain HTML video element played the sample in Playwright’s bundled Chromium 145 without an HLS library or extension. On Android, Chrome 156 opened the manifest directly in its native viewer and played it after we tapped Play. On Windows, headless Edge and Chrome decoded the same sample in a native HTML video element: playback advanced and reached 1920×1080 by the final sample.

On Android, try opening an authorized .m3u8 URL in Chrome and tap Play. On Windows, try the provider’s playback page or a local HTML page like the example below; our verified result is embedded-video playback, not direct-manifest playback. Match the player to your device and codecs, and the website integration to its supported browsers.

Chrome Android screenshot details before Play and during Big Buck Bunny playback, with the address bar below

Cropped screenshot details from our Pixel 11 Pro test on October 28, 2026: before Play (left), during playback (right), and Chrome’s address bar below.

For a minimal self-hosted page in a compatible browser:

<video controls src="https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8"></video>

8. Native HLS Playback Extension

Native HLS Playback, Gaetan Hervouet’s free Chromium extension, played the video embedded in our test page using its packaged embedded-video action. We did not verify toolbar, address-bar, or direct-URL handling. Inspect its permissions before installing.

Two Documented Alternatives We Did Not Test

9. IINA

IINA is a free, open-source macOS player built on mpv. Its official site lists native trackpad and media controls and picture-in-picture support.

10. Safari on Mac, iPhone, and iPad

Apple recommends HLS for streaming in its Safari video guidance (accessed 2026). On a Mac, iPhone, or iPad, try the authorized provider’s playback page in Safari. Playback depends on the device, codecs, browser, and website player; a site may use video.js or hls.js.

What Did We Test on Linux, Android, and Windows in October 2026?

On October 22, 2026, we checked the public Mux HLS sample using the eight Linux paths above. Firefox and Linux WebKit returned a media error with a plain video element.

On October 28, we opened the same URL in Chrome on a Pixel 11 Pro running Android 17. After tapping Play, sequential screenshots showed different Big Buck Bunny scenes, confirming advancing video. We did not measure first-frame startup time.

Google Photos displayed “Can’t play video” for the same URL. That message does not establish the cause or imply that Android playback generally fails.

On Windows, headless Edge and Chrome both played the same sample in a native HTML video element, with advancing playback and a 1920×1080 decoded picture at the end. We did not test Windows browser GUI playback or VLC on Windows; the Windows VLC menu steps above are based on VideoLAN documentation. IINA and Safari remain untested.

Test setup, versions, and timing notes

Test scope: The Linux checks were single-stream checks on Fedora 44, using a public H.264/AAC playlist with five renditions from 320×184 to 1920×1080. The Android and headless Windows browser checks used the same sample on one device each. These checks do not establish HEVC, DRM, casting, advertising behavior, channel-guide features, or performance on macOS or iPhone. Native Linux WebKit is not Safari.

How did we measure playback?

The browser checks used Playwright 1.58.2 and its bundled Chromium 145, Firefox 146.0.1, and Linux WebKit 26.0. The extension used a separately cached full Chromium 147 build. Tests used locally hosted pages, with Livepush inside an external frame. VLC ran as headless cvlc; command-line players decoded video without visible output. IPTVnator ran on a virtual display, and browser video was muted. We checked decoded frames, picture dimensions, and playback-clock progress. The extension’s packaged embedded-video action was invoked by automation.

The Android check used ADB ACTION_VIEW intents: Chrome 156.0.8078.47 opened the direct URL in its native viewer; Google Photos 7.97.0.1000520730 received an explicit HLS MIME intent. Screenshots captured the paused player, advancing video in Chrome, and the Photos error. The phone ran Android 17, SDK 37.

The Windows check used a Surface running Windows NT 10.0.26300.0, Edge 156.0.4314.42, and Chrome 155.0.8059.86. Each browser ran headless with a fresh temporary profile, GPU disabled, and autoplay enabled. A local HTML page used a muted, controlled video element with the sample URL and no JavaScript player library; playback was started through the browser debugging protocol. At approximately 0, 3, and 8 seconds of real elapsed time, Edge reported playback times of 0, 2.823215, and 7.838526 seconds and decoded-frame counts of 0, 175, and 476. Chrome reported 0.09256, 3.110907, and 8.129544 seconds and 11, 192, and 493 frames. Both ended at 1920×1080 with no media error; Edge reported one dropped frame and Chrome zero. This was not a first-frame benchmark, a visible GUI test, or a test of audible output.

Reported startup observations were VLC 3.0.24: 0.624 s; mpv 0.41.0: 3.861 s; ffplay 8.1.3: 2.053 s; hls.js 1.6.13: 0.425 s; Livepush: 0.447 s; Native HLS Playback 1.6.10: 0.464 s; plain Chromium: 0.464 s; and IPTVnator 0.24.0: 0.968 s. These are not comparable speed rankings: desktop timing started before process launch; browser timing began at source/player setup, the Play click, or extension invocation; IPTVnator timing excluded app launch and playlist import. mpv used its roughly once-per-second clock report rather than a first-frame measurement; other successful paths used frame callbacks or decoded-picture/frame logs.

After selecting 1080p in IPTVnator, we observed the picture staying at 512×288 for 60.107 seconds.

How Are IPTV Channel Lists Different?

An IPTV channel list and an HLS media playlist serve different purposes: a channel list points to stations, while a media playlist points to segments of a stream.

Dedicated IPTV apps can add electronic program guides (EPG), channel grouping, and favorites. Check those features separately with a playlist you are authorized to use.

Do Website Owners Need an M3U8 Player?

A website needs an embedded HLS-capable player, not a desktop app that visitors install. An HTML5 video player can use native browser support or a library; a managed service can handle encoding and delivery too. Compare the best video player for your website or follow our WordPress embedding guide.

For website owners: If you want managed encoding and delivery rather than maintaining a player integration, see SmartVideo plans and pricing.

How Do You Fix M3U8 Playback Issues?

An HLS stream can fail even when the player supports the format. Check the playlist and segment requests before changing applications.

1. CORS Errors (Cross-Origin Resource Sharing)

If a web-based player fails, open developer tools (F12) and look for a CORS error. Cross-origin browser playback requires the stream server to permit the requesting origin; check playlists, segments, and any key requests. If you control the server, fix its CORS headers. A desktop player can help compare paths, but is not a fix for your website’s configuration.

2. Mixed Content Warnings

On an HTTPS page, browsers may upgrade native HTTP media requests to HTTPS, while insecure fetch/XHR requests used by script-based players can be blocked. Use HTTPS for the playlist, segments, and keys, and inspect the console for upgraded or blocked requests (MDN mixed-content guidance).

3. Expired Tokens

Some authorized streams use signed URLs that expire. If a previously working link now fails, obtain a fresh playback URL through the provider’s normal access flow. Do not paste private or token-bearing URLs into third-party testers; use a local player or your own test page.

4. Geo-Blocking

A provider may reject requests based on your location. Inspect the response and the provider’s geographic restrictions rather than assuming a timeout identifies the cause.

5. 403 Forbidden

A 403 means the server refused the request. An expired signature, missing credentials, referrer policy, geographic restriction, or access rule can cause it. Inspect which playlist, segment, or key request failed and check the provider’s access requirements; a different player cannot grant permission.

6. “Cannot Load M3U8” in Chrome

Do not diagnose a codec problem from “Cannot load M3U8” alone. Check whether the master playlist and media segments load, inspect the player’s detailed error, and confirm the browser supports the stream’s codecs.

For a deeper understanding of how video delivery works and why these errors happen, see our guide on how video CDNs deliver HLS streams.

Frequently Asked Questions

Can Windows Media Player play M3U8 files?

Do not rely on Windows Media Player 12 for HLS playback. Microsoft’s supported-file list includes .m3u but does not list .m3u8; that is not a test of newer Windows media apps. Use VLC as a practical alternative.

How do I convert an M3U8 file to MP4?

Renaming a playlist does not convert it into video. A tool must fetch the referenced media and write it into an MP4 container. FFmpeg can remux compatible streams without re-encoding, but availability, codecs, encryption, and your permission to save the content determine whether that works (FFmpeg documentation).

For example, to remux the public Mux sample:

ffmpeg -i 'https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8' -c copy output.mp4
What is the difference between M3U and M3U8?

Both are playlist file formats, but M3U8 specifies UTF-8 encoding. The HLS specification, RFC 8216, requires HLS playlists to use UTF-8 with no byte order mark. A generic M3U channel list is not necessarily an HLS media playlist.

Is an M3U8 player required for my WordPress site?

You need HLS-capable playback on the page, but visitors should not need a standalone M3U8 app. An embedded HTML5 player with native HLS or a library, or a managed hosting service, handles playlists and segments inside the browser.

Why is my M3U8 stream constantly buffering?

Playback stalls when playable data arrives slower than it is consumed. Causes can include insufficient bandwidth for the selected rendition, slow delivery, gaps, or player trouble. Compare a lower rendition and inspect segment timings.

Which M3U8 players work for IPTV?

Use an app that imports channel lists and handles the guide format you need. IPTVnator documents M3U/M3U8 import, favorites, and XMLTV guides. VLC is a simpler option when you only need to open an individual channel URL.

How do I fix “Cannot load M3U8” in Chrome?

In Chrome’s Network panel, note the first failing playlist or segment request and its HTTP status; a failed master playlist can prevent later requests from appearing. Check the player’s detailed error and console for codec or decode errors, then compare those findings with the troubleshooting steps above.

How Should You Choose an M3U8 Player?

For a desktop starting point, use VLC; for a public browser test, Livepush played our sample and demonstrated a quality-menu change. For private streams, prefer a local player or your own test page. Match the tool to your device and confirm playback with your actual stream.

See SmartVideo Plans and Pricing →

Keep Visitors on Your Page, Not YouTube’s

SmartVideo’s player is 2x lighter than a YouTube embed, with zero ads. No suggested videos, no one else’s logo.

Build your player
10% conversion increase
“We’ve had a 10% increase in conversion rate from lead to customer.”
Pedro C.
Dir. of Digital Marketing, White Jacobs
Instant side-by-side winner
“SmartVideo loaded immediately; YouTube took 5 seconds to start. It became a no-brainer.”
Aaron H.
IT Director, PizzaTV
Rankings improved
“Our search-engine rankings went up after we switched over to Swarmify.”
Philip A.
Owner, Ignite Images