What is MPV Player?
Many Chinese users recommend local players, often starting with PotPlayer. However, PotPlayer’s performance is generally poor. Even on high-end hardware, clicking to play may take 2-4 seconds to respond, and it has serious ethical issues: PotPlayer as a closed-source software includes FFmpeg under the GNU GPL v3 open-source license. This protocol requires that if software A using this license is included in software B, then software B must also use this license and become open-source. Violating the open-source protocol is the biggest stain on PotPlayer.
At this point, MPV Player becomes the top choice, truly high-performance and truly open-source.
Download Links
Official website: https://mpv.io/installation/
Official recommended GitHub Windows build package: https://github.com/shinchiro/mpv-winbuild-cmake/releases
Core Features
- Open-source and Community-driven
MPV uses the GPL open-source license, allowing developers to freely modify source code. The community continuously contributes scripts, plugins, and third-party derivative versions (e.g., IINA for macOS, MPVPlayer for Android). - Minimalist Design
Default no traditional GUI interface, only operated via OSC (screen controller) and keyboard shortcuts. No ads or redundant features, focusing on core playback experience. - Cross-platform Support
Compatible with Windows, Linux, macOS, BSD, Android, etc., even embeddable in other applications as a playback library.
Core Advantages
- High Performance and Low Resource Consumption
- Supports hardware decoding (e.g., GPU-accelerated VAAPI, DXVA2, Vulkan), smooth playback of 4K/8K ultra HD videos, even on old devices.
- Play network streaming (e.g., YouTube, Bilibili) with
youtube-dlto automatically parse and load high-definition resources.
- Highly Customizable
- Script Extension: Supports Lua and JavaScript scripts, users can customize playback logic (e.g., auto-load subtitles, speed-up playback) or interface styles. For example, through community scripts, features like live chat or Kodi-style themes can be implemented.
- Configuration File: All parameters (e.g., decoders, shortcuts, OSC layout) can be adjusted via
mpv.confandinput.conf, meeting the needs of enthusiasts.
- Strong Format Compatibility
Supports almost all mainstream audio-video formats (e.g., MKV, MP4, FLAC, APE) and subtitle types (including ASS special effects subtitles), without needing additional decoders. - Privacy and Security
No ads, no data collection, transparent open-source code, users can review code security themselves, suitable for privacy-conscious users. - Lightweight and Portable
Installation package only 20-40MB, unpack and use directly, no registry writing, suitable for USB drives or integration into other software (e.g., Xiaowu Cloud Disk built-in MPV as playback core).
Applicable Scenarios
- Technology Enthusiasts: Customize player behavior via command line or scripts.
- Audiovisual Enthusiasts: Pursue high-quality output (HDR, color management) and smooth playback experience.
- General Users: Use third-party optimized versions (e.g., MPV-EASY Player or MPV-lazy) to lower the learning curve, enjoy ad-free pure playback.
Comparison with Other Players
| Comparison Item | MPV Player | PotPlayer | VLC |
|---|---|---|---|
| Performance | Better hardware decoding optimization, low resource consumption | Moderate | Moderate |
| Customization Ability | Script + configuration file, extremely high | Limited plugin expansion | Limited plugin expansion |
| User-friendliness | Need to learn shortcuts or use third-party optimized versions | Graphical interface is complete | Graphical interface is complete |
| Privacy Protection | No ads, open-source transparent | Contains ads (non-official version) | No ads, open-source |
Clearly, MPV Player has significant advantages. The only drawback is the official default installation package’s very simple interface, which may make many ordinary users unaware of how to use it.
For newcomers, it is recommended to use third-party optimized versions (e.g., MPV-EASY Player or MPV-lazy) to lower the threshold and quickly experience its core advantages.
MPV Player Configuration
The following is my used configuration file for reference.
mpv.conf
## Decoding/Rendering Settings##
# Video output driver, Windows can choose gpu/gpu-next/direct3d etc., gpu is the most mature and stable, gpu-next is experimental, direct3d is only used when compatible with old system hardware
vo=gpu
# Set hardware decoding API, auto/auto-copy/no correspond to automatic/automatic-memory copy/soft decode
hwdec=auto
# Rendering API, can choose auto/d3d11/opengl/vulkan
gpu-api=auto
# Try using hard decoding formats (default h264, vc1, hevc, vp8, vp9, av1; all is a special value indicating all formats)
# hwdec-codecs=all
# gpu-api=d3d11 when (win default api) multi-GPU platforms specify the used GPU, GPU name reference device manager. This option recognizes the first string, if it's not the same GPU, no need to input full name. If using Vulkan, it is vulkan-device=
# d3d11-adapter=AMD
# d3d11-adapter=Intel
# d3d11-adapter=NVIDIA
# d3d11va zero-copy mode, can reduce GPU 3D engine usage
# d3d11va-zero-copy=yes
## Cache Settings##
# Enable cache
cache=yes
# Maximum cache size (KiB or MiB)
demuxer-max-bytes=64MiB
# Use memory instead of disk cache
cache-on-disk=no
# Cache time
# cache-secs=8
## Playback Status Recording##
# Remember playback status when exiting (including pause, volume, playback speed, position etc.)
save-position-on-quit
# Playback status save location
# watch-later-directory=D:\Cache\watch_later
# Do not record whether paused (except pause similarly can write fullscreen, mute, speed, ontop etc. parameters)
watch-later-options-remove=pause
# Record playback status while ignoring file path (for backup/sharing, but affects same-named files distinction)
# ignore-path-in-watch-later-config
## Window Settings##
# Snap to edge (limited to Windows platform)
snap-window=yes
# High DPI window scaling
# hidpi-window-scale=no
# Borderless
# border=no
# Topmost
ontop=yes
# Fullscreen
# fullscreen=yes
# Keep aspect ratio of the window
# keepaspect-window=no
# Keep open after playback (yes|no|always)
# keep-open=no
# Set default window size and position (example is 1280x720, bottom-left of screen)
# geometry=1280x720+100%+100%
# Drag-and-drop file behavior setting (no/auto/replace/append). no disable drag-and-drop, auto automatically select according to platform, replace replace current file and play, append add dragged files to playlist. Default is drag-and-drop replace, hold shift drag-and-drop append
drag-and-drop=auto
## OSD Settings##
# Disable on-screen information bar display
# osd-bar=no
# osd-bar border size, added in mpv0.37.0 later versions
osd-bar-border-size=0
# osd-bar width [1, 100], percentage of screen width
osd-bar-w=100
# osd-bar height [0.1, 50] percentage of screen height
osd-bar-h=0.3
# Position [-1, 1] x is left to right, y is top to bottom
osd-bar-align-y=1
# OSD color, ARGB16 hexadecimal representation
osd-color="#7FFFD4"
# OSD background color, same 16-bit hexadecimal ARGB, first two digits are transparency value
# osd-back-color="#30000000"
# OSD information position, font size, border size (left/center/right, top/center/buttom)
osd-align-x=left
osd-align-y=top
osd-font-size=22
osd-border-size=2
# Set the duration of OSD text information (milliseconds)
osd-duration=2000
# OSD scales with window size
osd-scale-by-window=no
## Video/Audio/Subtitle/Screenshot Settings##
# Read Dolby Vision metadata (needs to change vo=gpu to experimental vo=gpu-next)
# vf=format:dolbyvision=yes
# Color management
# icc-profile-auto=yes
# Video synchronization
# video-sync=display-resample
# interpolation=yes
# Audio pitch correction when speed-up playback
audio-pitch-correction=yes
# Audio pitch correction maximum speed without silence
af=scaletempo2=max-speed=4
# Automatically load external subtitle files. (fuzzy loads subtitle files with the same name as video files in the same folder)
sub-auto=fuzzy
# Automatically load audio files with the same name as video files
#audio-file-auto=fuzzy
# Font size, this value is proportional to a screen of height 720, larger or smaller screens will scale
sub-font-size=44
# Font for subtitles without specified style
sub-font=sans-serif
# Border size for subtitles without specified style
sub-border-size=2
# Force external ASS subtitle to use black borders
sub-ass-force-margins=yes
# Specify priority for audio tracks (using ISO-639 language codes, priority in order)
alang=zh,chi,chs,sc,zh-hans,en,eng
# Specify priority for subtitle tracks (same as above)
slang=zh,chi,chs,sc,zh-hans,en,eng
# Playlist loop mode, N|inf|no, loop N times/always loop/never loop
loop-playlist=inf
# Start with default volume
volume=90
# Maximum volume [100, 1000]
volume-max=100
# Screenshot file format (optional: jpg, png, webp, jxl, avif)
screenshot-format=jpg
# Screenshot file save path
# screenshot-directory=C:\Image
## Miscellaneous##
# Disable built-in shortcut scheme, builtin compared to default does not affect script preset shortcuts
no-input-builtin-bindings
# Disable built-in on-screen controller (OSC)
# osc=no
# Output logs to desktop
# log-file = "~~desktop/mpv.txt"
# Record media stream to specified file
# stream-record=C:\Videos\output.mp4
## Configuration Group##
# Do not insert regular configuration between configuration groups
# Disable built-in shortcut scheme, builtin compared to default does not affect script preset shortcuts
# no-input-builtin-bindings
# Disable built-in on-screen controller (OSC)
# osc=no
# Output logs to desktop
# log-file = "~~desktop/mpv.txt"
# Record media stream to specified file
# stream-record=C:\Videos\output.mp4
## Configuration Group##
# Do not insert regular configuration between configuration groups
# High-quality rendering mode, enabled by default in 0.37.0+
# profile=high-quality
# High-performance low-power mode, suitable for low-end devices
# profile=fast
# Pause or fullscreen without topmost
[ontop-playback]
profile-cond=pause or fullscreen
ontop=no
profile-restore=copy
# When the file path contains 'music', disable recording playback status and OSC always resident
#[music]
#profile-cond=require 'mp.utils'.join_path(working_directory, path):match('music') ~= nil
#save-position-on-quit=no
#script-opts-add=osc-visibility=always
#profile-restore=copy
input.conf
MBTN_LEFT ignore # Mouse left button no operation
MBTN_LEFT_DBL cycle fullscreen # Left mouse double click switch fullscreen
MBTN_RIGHT cycle pause # Right mouse button toggle pause
MBTN_MID ignore # Middle mouse button no operation
MBTN_BACK playlist-prev # Side button forward play previous playlist
MBTN_FORWARD playlist-next # Side button backward play next playlist
WHEEL_UP add volume 5 # Wheel up increase volume by 5
WHEEL_DOWN add volume -5 # Wheel down decrease volume by 5
WHEEL_LEFT seek 2 # Wheel left forward 2 seconds (for touchpad)
WHEEL_RIGHT seek -2 # Wheel right backward 2 seconds
ESC set fullscreen no # ESC exit fullscreen
SPACE cycle pause # Space toggle pause
ENTER cycle fullscreen # Enter switch fullscreen
KP_ENTER cycle fullscreen # Numeric keypad enter switch fullscreen
UP add volume 2 # Arrow up increase volume by 2
DOWN add volume -2 # Arrow down decrease volume by 2
Shift+UP add volume 10 # Volume +10
Shift+DOWN add volume -10 # Volume -10
LEFT seek -5 # Arrow left backward 5 seconds (fast but not precise)
RIGHT seek 5 # Arrow right forward 5 seconds
Ctrl+LEFT seek -3 exact # Backward 3 seconds (exact is slower but more accurate)
Ctrl+RIGHT seek 3 exact # Forward 3 seconds
Shift+LEFT seek -90 # Backward 90 seconds
Shift+RIGHT seek 87 exact # Forward 87 seconds
Alt+UP add audio-delay -0.1 # Audio delay -0.1
Alt+DOWN add audio-delay +0.1 # Audio delay +0.1
Alt+LEFT add sub-delay -0.1 # Subtitle delay -0.1
Alt+RIGHT add sub-delay 0.1 # Subtitle delay +0.1
PGUP playlist-prev # Play previous playlist
PGDWN playlist-next # Play next playlist
HOME add chapter -1 # Previous chapter
END add chapter 1 # Next chapter
F8 show-text ${playlist} # F8 display playlist
F9 show-text ${track-list} # F9 display video, audio, subtitle track information
INS script-message-to console type "loadfile '';keypress ESC" 11 # Open console and input loadfile command, pointer position to the 11th character, then can directly use shift+INS or ctrl+v paste link, enter play, and trigger ESC key command to exit console
DEL script-message-to console type "playlist-play-index '';keypress ESC" 22 # Input switch playlist index (starting from 0)
z set speed 1.0 # Set playback speed to 1
Z set speed 2.5 # Set playback speed to 2.5
x add speed -0.1 # Playback speed -0.1
c add speed 0.1 # Playback speed +0.1
X multiply speed 0.5 # Playback speed x0.5
C multiply speed 2.0 # Playback speed x2
v frame-back-step # Previous frame
b frame-step # Next frame
V sub-seek -1 # Previous subtitle
B sub-seek 1 # Next subtitle
n add sub-pos -1 # Subtitle move up 1
m add sub-pos +1 # Subtitle move down 1
, add sub-scale -0.05 # Subtitle shrink 5%
. add sub-scale +0.05 # Subtitle enlarge 5%
/ set sub-pos 100;set sub-scale 1;set audio-delay 0;set sub-delay 0 # Restore subtitle position & size & delay and audio delay
a cycle audio # Switch audio track
s cycle sub # Switch subtitle track
d cycle sub-visibility # Switch subtitle on/off
f cycle mute # Mute on/off
g cycle ontop # Topmost on/off
G cycle border # Borderless on/off
h cycle-values hwdec "auto" "no" # Switch hardware decoding/soft decoding
j cycle deinterlace # Switch de-interlacing
k cycle-values video-aspect-override "16:9" "4:3" "2.35:1" "-1" # Cycle video aspect ratio
l ab-loop # Set/clear A-B loop points
J playlist-shuffle; show-text "playlist-shuffle" # Shuffle playlist
K cycle-values loop-file inf no # Switch file looping
L cycle-values loop-playlist inf no # Switch playlist looping
; script-binding osc/visibility # Switch OSC visibility (always resident, hidden, automatic)
' cycle-values osd-level "1" "2" "3" # Switch OSD display level
TAB script-binding stats/display-stats-toggle # Switch statistics info on/off, 1234 can flip pages
q add brightness -1 # Brightness -1
w add brightness 1 # Brightness +1
e add contrast -1 # Contrast -1
r add contrast 1 # Contrast +1
t add gamma -1 # Gamma -1
y add gamma 1 # Gamma +1
u add saturation -1 # Saturation -1
i add saturation 1 # Saturation +1
o add hue -1 # Hue -1
p add hue 1 # Hue +1
[ set contrast 0; set brightness 0; set gamma 0; set saturation 0; set hue 0 # Video equalizer zero
] show-text "Speed=${speed} Topmost=${ontop} Single loop=${loop-file} Full loop=${loop-playlist} Subtitle delay=${sub-delay} Audio delay=${audio-delay} Brightness=${brightness} Contrast=${contrast} Gamma=${gamma} Saturation=${saturation} Hue=${hue}" # Display status information
\ show-progress # Show playback progress
` script-binding console/enable # Open console, ESC exit
1 set window-scale 0.333 # Set window to original video output 0.333 times
2 set window-scale 0.667 # Set window to original video output 0.667 times
3 set window-scale 1.0 # Set window to original video output size
4 add current-window-scale -0.1 # Reduce window size
5 add current-window-scale 0.1 # Enlarge window
6 add video-zoom -0.01 # Reduce video (log2 logarithmic ratio)
7 add video-zoom 0.01 # Enlarge video
8 add panscan -0.1 # Reduce cropping
9 add panscan 0.1 # Crop video to reduce black borders
0 cycle-values "!reverse" video-rotate "no" "90" "180" "270" # Reverse loop, no rotation/90/180/270
ALT+a add video-align-x -0.1 # Adjust video alignment position
ALT+d add video-align-x 0.1
ALT+s add video-align-y -0.1
ALT+w add video-align-y 0.1
- set video-zoom 0 ; set panscan 0 ;set video-align-x 0 ; set video-align-y 0# Reset zoom/cropping/position
+ screenshot window # Screenshot with interface (OSC/OSD)
= screenshot video # Video screenshot
