unsubbed.co

MPV

A free, open source, and cross-platform media player for the command line.

A free, open-source video player with 34,000+ GitHub stars and zero GUI polish. Reviewed honestly for people who care what’s actually running their video.

TL;DR

  • What it is: Free (as in freedom) open-source media player, descended from MPlayer, now the gold standard for high-quality video playback on Linux, macOS, and Windows [1].
  • Who it’s for: Power users, Linux enthusiasts, anyone who’s hit the ceiling of VLC or Windows Media Player, and developers who want an embeddable playback library [website].
  • Cost: $0. No subscription, no freemium tier, no “Pro” edition. It’s GPL/LGPL software built entirely by volunteers.
  • Key strength: Best-in-class video quality output — OpenGL, Vulkan, and D3D11 rendering with hardware decoding, HDR support, frame interpolation, and color management that commercial players can’t touch [website][1].
  • Key weakness: The UI is intentionally minimal to the point of alienating — the on-screen controller is a bare overlay that vanishes when you stop hovering. Configuration lives in plain-text config files. If you want a proper GUI with a media library, you need a frontend wrapper [1].

What is MPV

mpv is a command-line media player. The project’s own README leads with that phrase — “a free (as in freedom) media player for the command line” — and it’s not apologizing for it. It’s a fork of MPlayer (itself a fork of MPlayer2), and it’s been maintained actively for over a decade with the stated focus on “code refactoring and cleanups as well as adding features” [website].

At 34,462 GitHub stars, it’s one of the most-starred media player projects in open source. The practical pitch is: if VLC is the Swiss Army knife of media players — handles everything, looks like 2007 — then mpv is the Japanese kitchen knife: fewer features, steeper learning curve, dramatically better at the one thing it actually does.

The core use case is local video playback with the highest possible output quality. Where VLC’s default video output is functional but untuned, mpv’s renderer uses shaders for scaling and processing, supports wide color gamut, HDR10, and Dolby Vision on supported hardware, and ships with frame timing that eliminates judder on variable-refresh displays [website][1]. These aren’t checkbox features — they change what the video actually looks like.

It runs on Linux, Windows 10 (1607+), macOS 10.15+, and BSD. Android builds exist via third-party distribution. A straightforward C API makes it embeddable in other applications — several GUI frontends (Celluloid, IINA on macOS, Haruna) are built on top of mpv specifically because they wanted the renderer without having to write one [website].


Why people choose it

The it’s-foss review [1] written by Abhishek Prakash lands on what most mpv converts say: the appeal is the combination of minimalism and depth that nothing else offers. The interface is deliberately sparse — “displaying only necessary controls” — but underneath there are 447 configuration options you can tune. That ratio is unusual. Most players are either shallow and polished (Windows Media Player, QuickTime) or feature-rich and cluttered (VLC, Kodi). mpv is feature-rich and hidden.

Versus VLC. VLC is the default comparison because it runs everywhere and plays everything. The honest answer is that VLC is better for casual use — it opens without configuration and handles edge-case containers that mpv sometimes chokes on. mpv wins on video quality (the shader-based renderer is simply better for high-resolution content), scripting extensibility, and the ability to stream URLs including YouTube via yt-dlp integration. For anyone playing 4K HDR content or doing frame-accurate video review, VLC is not a serious competitor.

Versus Windows Media Player / Media Player Classic. Both are Windows-only, both lack the renderer quality. MPC-HC is a reasonable alternative for Windows users who don’t want to touch the command line — it’s been around forever and it works — but it’s no longer actively maintained by its original developers. mpv is.

Versus Plex/Jellyfin. This is the “SaaS” angle for a media player. Plex and Jellyfin are media servers — different category. But many people running Plex locally use mpv as the playback client via third-party connectors precisely because Plex’s built-in player doesn’t match mpv’s video quality. These tools solve different problems; mpv doesn’t have a library browser, transcoding, or remote access.

The scripting argument. The it’s-foss review [1] and the mpv website both point to Lua scripting as the extensibility layer. The mpv wiki lists hundreds of user scripts — auto-subtitles, thumbnail seeking, watch history, skip-silence, auto-crop, quality selectors for streaming. For users who hit the ceiling of what a GUI offers and want automation, this is a significant differentiator. mpv is closer to a scriptable platform than a traditional media player [website][1].

The MPRIS plugin story. On Linux specifically, mpv integrates with the desktop’s media control infrastructure via a community plugin called mpv-mpris [4]. This implements the MPRIS D-Bus interface so media keys, desktop widgets, and tools like playerctl work with mpv — something the player doesn’t ship with out of the box. That it requires an external plugin is a genuine limitation; that the plugin exists and works cleanly with GNOME and KDE is a sign of a healthy surrounding ecosystem [4].


Features

Video output:

  • OpenGL, Vulkan, and D3D11 renderers [website]
  • Shader-based video scaling with popular high-quality algorithms (Lanczos, ewa_lanczos, etc.)
  • HDR support with tone mapping
  • Color management and ICC profile support
  • Frame timing and interpolation to eliminate judder
  • Hardware decoding via NVDEC, VAAPI, DXVA2, VideoToolbox — opt-in, not default [README]

Format support:

  • Backed by FFmpeg, so practically every codec and container works: MKV, MP4, AVI, m2ts, MPEG, H.264, H.265/HEVC, AV1, VP9
  • Subtitle support: SRT, ASS/SSA, PGS, embedded subtitles
  • Audio: every format FFmpeg handles, plus ALSA and PulseAudio output on Linux [README]

Streaming:

  • YouTube, Twitch, and any URL yt-dlp supports (yt-dlp/youtube-dl must be installed separately) [1]
  • DASH and HLS native via FFmpeg
  • Direct URL playback from the command line

Scripting and extensibility:

  • Lua scripting API (optional dependency — required for the OSC overlay and yt-dlp integration) [README]
  • JavaScript scripting also supported
  • C plugin API for compiled extensions (mpv-mpris is a C plugin [4])
  • Large wiki library of user scripts for quality-of-life additions [website]

Embeddability:

  • Straightforward C API for integrating mpv as a library in other applications [website]
  • Powers Celluloid (Linux), IINA (macOS), Haruna (KDE), and others

What’s not there:

  • No media library or file browser
  • No transcoding
  • No network streaming server
  • No GUI settings panel — configuration is via mpv.conf text file [1]
  • No out-of-the-box MPRIS support on Linux — requires mpv-mpris plugin [4]

Pricing: The “SaaS vs self-hosted” math

mpv doesn’t have a SaaS competitor in the traditional sense — the closest parallel is Plex’s premium tier ($6–7/month for Plex Pass) which unlocks hardware transcoding, offline sync, and mobile apps. If you’re running a home media server, that’s a recurring bill for features that only matter for the server side.

For local playback specifically, the real cost comparison is mpv ($0 forever) vs doing nothing and tolerating Windows Media Player or a degraded playback experience. There’s no math to do. The question is whether the setup cost — learning the config system, installing yt-dlp, adding the right config entries for your hardware — is worth the output quality improvement.

For a developer embedding a player in another application, the comparison is against commercial SDKs (Wowza, THEO player, Bitmovin) which can cost hundreds to thousands of dollars per month. mpv’s C API is free, maintained, and battle-tested across every major OS [website].


Deployment reality check

“Deployment” for a desktop media player means installation and configuration. The package manager path is simple — mpv is in every major Linux distribution’s default repositories, Homebrew on macOS, and Chocolatey/Scoop on Windows [1]. Building from source requires meson, FFmpeg dev headers, libplacebo, and optional libraries for hardware decoding [README]. It’s not trivial to build from scratch, but you almost never need to.

Where it gets annoying:

Configuration is via ~/.config/mpv/mpv.conf. There’s no GUI settings panel. If you want hardware decoding, you add hwdec=auto to the config. If you want yt-dlp integration, you install yt-dlp separately and point mpv at it. The it’s-foss review [1] specifically flags YouTube buffering issues and external subtitle handling as pain points — both are real, and both have workarounds in config or user scripts, but you have to find them yourself.

The 447 configuration options mentioned in [1] is not a typo. The mpv manual is comprehensive and well-maintained, but it’s a reference document, not a tutorial. New users who expect a settings menu will hit a wall immediately.

Hardware decoding caveat: The README is explicit — --hwdec is not enabled by default because mpv’s “focus is not on power-efficient playback on embedded or integrated GPUs.” This is principled engineering honesty. It also means first-time users on laptops might wonder why their CPU fan is spinning. Add hwdec=auto to mpv.conf; it takes 10 seconds and helps on most modern hardware [README].

On Linux: Works best here. Wayland support via vo=gpu-next, ALSA/PulseAudio/PipeWire audio, VAAPI/NVDEC hardware decoding. The mpv-mpris plugin makes media keys work with a few minutes of setup [4].

On macOS: IINA is the recommended frontend for users who want a native-looking app — it wraps mpv’s renderer in a macOS UI. VideoToolbox hardware decoding works well.

On Windows: Third-party builds are available from shinchiro and others. The renderer works via D3D11. No official installer; download is a zip or use a package manager.


Pros and Cons

Pros

  • Best-in-class video renderer. OpenGL/Vulkan shaders, HDR tone mapping, color management, frame interpolation. No free competitor matches this [website].
  • 34,000+ GitHub stars, actively maintained. Not a dead project [merged profile].
  • Truly free, no strings. GPL/LGPL. No subscription, no tracking, no “Pro” edition holding good features hostage.
  • Lua/JS scripting ecosystem. Hundreds of community scripts extend functionality without patching the player itself [website][1].
  • Embeddable C API. Powers major GUI frontends on every platform — if you don’t like the CLI, a polished wrapper exists [website].
  • yt-dlp integration. Stream YouTube, Twitch, and thousands of other sites from the command line without a browser [1].
  • Hardware decoding on every major platform. NVDEC, VAAPI, DXVA2, VideoToolbox — opt-in, explicit, documented [README].

Cons

  • Zero GUI for settings. Configuration is a text file. Not a dealbreaker for technical users; a full stop for non-technical ones [1].
  • No media library. mpv plays files and URLs. If you want a browsable collection, use Jellyfin, Kodi, or Plex for the front-end and wire mpv as the player.
  • External subtitle handling has edge cases. The it’s-foss review [1] flags this explicitly — some subtitle files need manual path specification or don’t load as expected.
  • YouTube buffering. Streaming via yt-dlp works, but buffering behavior under slower connections can be erratic. Config options help; it’s not seamless [1].
  • MPRIS support requires a plugin. On Linux, media key support doesn’t work out of the box — you need mpv-mpris, which requires mpv to be built with —enable-cplugins (default since 0.26) and Lua support [4].
  • Hardware decoding is opt-in with manual config. Good for reliability; annoying to discover on first use.
  • No official Windows/macOS builds from the project. You depend on third-party packagers for binary distributions [README].

Who should use this / who shouldn’t

Use mpv if:

  • You’re on Linux and want a media player that integrates properly with your desktop without a configuration fight once you learn the config system.
  • You care about video quality — HDR, 4K, anime with high-quality upscaling, or anything where the difference between “good enough” and “correct” matters.
  • You want to stream YouTube or other sites locally without a browser, via yt-dlp integration.
  • You’re a developer building a video-capable application and need a high-quality embeddable player [website].
  • You’re comfortable editing a config file and reading documentation.

Skip it (use VLC) if:

  • You open video files occasionally and have no opinion on rendering quality.
  • You regularly encounter unusual containers or codecs that need format negotiation.
  • You want a GUI with menus, a preferences panel, and settings you can click through.

Skip it (use Jellyfin/Kodi) if:

  • You want a media library — something that scans your files, fetches metadata, and lets you browse by genre or director. mpv is a player, not a library manager.

Skip it (use IINA on macOS) if:

  • You want the mpv renderer but in a native macOS app with a proper menu bar, Touch Bar support, and settings panels. IINA wraps mpv and looks native.

Alternatives worth considering

  • VLC — the safe default. Handles everything, free, runs on everything. Video quality is lower than mpv’s renderer, especially for HDR and 4K content. GUI is full-featured.
  • IINA (macOS) — native macOS frontend wrapping mpv. Best option for Mac users who want mpv’s quality without CLI configuration.
  • Celluloid / GNOME MPV — Linux GTK frontend for mpv. The it’s-foss review [1] specifically recommends it for users who want more GUI than mpv’s bare overlay.
  • Haruna (KDE) — KDE Plasma frontend for mpv. Native Qt integration.
  • MPC-HC / MPC-BE — Windows-only. MPC-HC is no longer actively maintained by its original team; MPC-BE continues. Good for Windows users who want a GUI without the mpv config learning curve.
  • Kodi — full media center, not a simple player. Right if you want a library, streaming plugins, and TV-style interface. Wrong if you just want to play a file well.
  • Jellyfin — media server, not a player. Use it as the library manager and configure mpv or IINA as the playback client for best-of-both.

Bottom line

mpv is the right answer to a specific question: “what plays video with the highest quality available on my hardware, for free, without a subscription or tracking?” If that’s not your question — if you want a media library, a polished GUI, or zero configuration — then it’s not the right tool. The minimal interface isn’t a bug they haven’t gotten around to fixing; it’s a deliberate choice by a project that cares about the renderer and expects users to bring their own frontend.

The 34,000 GitHub stars don’t come from people who stumbled into it. They come from Linux users, videophiles, developers, and people who got tired of VLC’s upscaling artifacts and spent a Saturday learning a config file. If that’s you, the payoff is real.


Sources

  1. Abhishek Prakash, It’s FOSS“MPV Player: A Minimalist Video Player for Linux” (January 11, 2023). https://itsfoss.com/mpv-video-player/
  2. LinuxLinks“mpv-mpris — plugin for mpv” (Updated October 4, 2025). https://www.linuxlinks.com/mpv-mpris-plugin-mpv/

Primary sources: