mpv.conf


This is the extended guide. Click HERE to return to the basic guide.

Last tested build: v0.33.0
Use newer builds at your own risk.

For a more detailed documentation click HERE.
I only offer a tl;dr version for “most-used” options.

Keep in mind that all stuff written here is optimized for anime content and might look worse on other content.

If you notice something outdated or wrong, you can contact me via Discord.


Example config files:

Please don’t simply 1:1 copy the configs. Some settings are there for certain reasons, you probably don’t have. The configs might not run well on every PC.


Stuff that is good to have or you need for certain options:

Only download what you actually need/want!

Copy the .hook or .glsl files into the „Shaders“ folder inside the mpv folder (create it, if it doesn’t exist):

Copy the .lua files into the „Scripts“ folder inside the mpv folder (create it, if it doesn’t exist):

  • Autoload – Loads the next video inside the same folder (next episode)
  • Easycrop – Lets you crop black borders
  • webm – Lets you create webm videos
  • (MORE SCRIPTS)

General:
#The default profile which sets some recommended settings
profile=gpu-hq

#The called API
#Use "opengl" if you have compatibility issues.For displaying HDR content (not HDR -> SDR) "d3d11" is recommended (Windows only). 
gpu-api=vulkan

#Hardware decoding for whatever your CPU/GPU supports (e.g. 8bit h264 / 10bit h265)
#Only should be used when your CPU/GPU are very old, else avoid using it
#Use "auto-copy-safe" for the safest result in trade of better performance
#You can manually try "d3d11va" / "dxva2-copy" on Windows, "vaapi" / "vaapi-copy" on Linux or "nvdec" / "nvdec-copy" with an Nvidia GPUs
hwdec=auto-safe

#Don't close the player after finishing the video
keep-open=yes

#The last position of your video is saved when quitting mpv
save-position-on-quit=yes

#Start mpv with a % smaller resolution of your screen
autofit=50%

#Force seeking (if seeking doesn't work)
force-seekable=yes

OSD:
#Don't show a huge volume box on screen when turning the volume up/down
osd-bar=no

#Cursor hide in ms
cursor-autohide=100

Priority:
#Audio language priority
alang=ja,jp,jpn,en,eng,de,deu,ger

#Subtitle language priority
slang=en,eng,de,deu,ger

Audio:
#Default volume of the player
volume=100 

#Max volume of the player
volume-max=200

#Load external audio with (almost) the same name as the video
audio-file-auto=fuzzy

#Audio delay 
#Useful if you're watching with your headphones on PC, but output the video on your Television with a long HDMI cable (counter the delay) 
audio-delay=+0.084

Subs:
#Forces showing subtitles while seeking through the video
demuxer-mkv-subtitle-preroll=yes

#Backward compatibility for vsfilter
#Disabling it "no" can result in broken subtitles in older vsfilter subtitles (recommended)
#Enabling it "yes" can result in broken subtitles in newer libass subtitles sub-ass-vsfilter-blur-compat=no #Fixes subtitle timing for gaps smaller than 210ms (works with PGS subtitles) sub-fix-timing=yes #Load external subtitles with (almost) the same name as the video sub-auto=fuzzy #Some settings fixing VOB/PGS subtitles (creating blur & changing yellow subs to gray) sub-gauss=1.0 sub-gray=yes #Loads external .ass file for overwriting the styles of the current subtitles sub-ass-styles=C:\mpv\template_advanced.ass #Some settings overwritting the default Arial for .srt subtitles (or .ass if you force it) sub-font=Andika New Basic Bold sub-font-size=52 sub-blur=0.2 sub-border-color=0.0/0.0/0.0/1.0 sub-border-size=3.0 sub-color=1.0/1.0/1.0/1.0 sub-margin-x=100 sub-margin-y=50 sub-shadow-color=0.0/0.0/0.0/0.25 sub-shadow-offset=0

Screenshot:
#Output format of screenshots
screenshot-format=png

#Same output bitdepth as the video
#Set it "no" if you want to save disc space
screenshot-high-bit-depth=yes

#Compression of the PNG picture (1-9)
#Higher value means better compression, but takes more time
screenshot-png-compression=1

#Quality of JPG pictures (0-100)
#Higher value means better quality
screenshot-jpeg-quality=95
#Output directory
screenshot-directory="C:\Pictures"

#Name format you want to save the pictures
screenshot-template="%f-%wH.%wM.%wS.%wT-#%#00n"

You make screenshots with the “s” hotkey.


Dither:

You can skip this part, because the default values are already fine.

#Use "auto" or "8"/"10"/"12" depending on your display bitdepth
#Can lead to ugly outputs when you set the wrong bitdepth number
dither-depth=auto

#Selects the dithering algorithm
#Use "error-diffusion" with high-end GPUs (experimental), else use "fruit"
dither=fruit

#Selects the kernel in case of error-diffusion
#"sierra-lite" is the fastest choice with decent results, alternatives are "floyd-steinberg" (slow), "atkinson" (slower) and "jarvis-judice-ninke" (slowest) 
error-diffusion=sierra-lit

Deinterlace:

For an explanation what deinterlace is, click HERE.

You activate deinterlace with the “d” hotkey.
Only use it with interlaced sources (like MPEG2/h264 .ts files)


Deband & Dynamic Grain:

For an explanation what debanding is, click HERE.
For an explanation what grain is, click HERE.

#Debanding on all videos
#Set it "no" if you rather handle it with profiles
deband=yes

#Deband steps (More = Better quality, but higher GPU cost)
deband-iterations=4

#Deband strength (More = Less banding, but more detail loss)
deband-threshold=48

#Deband range (More = Less banding, but higher GPU cost)
deband-range=16

#Dynamic Grain (More = More dynamic grain)
#Set it to "0" in case you use the static grain shader
deband-grain=48

You activate debanding with the “h” hotkey.


(Static) Grain:

For an explanation what static grain is, click HERE.
Important: The “Static Noise Luma” & “Static Noise Chroma” scripts are a requirement for that.

#Luma
glsl-shader="C:\mpv\Shaders\noise_static_luma.hook"

#Chroma
glsl-shader="C:\mpv\Shaders\noise_static_chroma.hook"

If you use shaders like “nnedi3” or “ravu”, make sure you run grain shaders before them!


Resizer:

For an explanation what a resizer is, click HERE.
Never ever use Anime4K, because it is not an upscaler!
With the “i” hotkey you can see how many delayed and dropped frames you have. With clicking “2” after that (changing to the 2nd page) you can see if shaders are loaded properly.

Normal: Regular scaler
Italic: Irregular scaler: Look at (4*) for sinc (with blackman)
Italic & Underlined: Based on a shader: Look at (1*) for FSRCNNX/ravu/nnedi3, look at (2*) for SSimDownscaler, look at (3*) for KrigBilateral

PRESETS LUMA
UPSCALE
LUMA
DOWNSCALE
CHROMA
UP- & DOWNSCALE
Experimental FSRCNNX_x2_16-0-4-1    
Overkill ravu-zoom-r4*
nnedi3-nns256-win8x4 *
SSimDownscaler KrigBilateral
Very High ravu-r4*
ravu-lite-r4*
ewa_lanczossharp
ewa_lanczos
ewa_lanczossoft
ravu-zoom-r4-chroma *
High ewa_lanczossharp
ewa_lanczos
ewa_lanczossoft
ewa_lanczossharp
ewa_lanczos
ewa_lanczossoft
ewa_lanczossharp
ewa_lanczos
ewa_lanczossoft
Medium spline64
spline36
spline16
spline64
spline36
spline16
sinc (with blackman)
Low catmull_rom catmull_rom catmull_rom
Very Low bicubic_fast bicubic_fast bicubic_fast

* Ravu: Try a lower “r” variant like r3 or r2 if your GPU can’t handle r4.
* Nnedi3: Try a lower “nns” like 128 or 64 if your GPU can’t handle 256.

Regular scaler:

#Luma upscale 
scale=... 
For example: scale=bicubic_fast

#Luma downscale 
dscale=... 
For example: dscale=bicubic_fast

#Chroma up- & downscale
cscale=... 
For example: cscale=bicubic_fast

Luma (scale/dscale) = Brightness (black & white) information
Chroma (cscale) = Colour information
Luma is more visible for the human eye.
A better resizer means higher GPU cost.

Irregular scaler:
(4*)

sinc (with blackman):

cscale=sinc
cscale-window=blackman
cscale-radius=3

Based on a shader:

#Shaders which override "scale"/"dscale"/"cscale" to a certain point (depending on the shader you use)
glsl-shader= ...

(1*) nnedi3 and ravu are only upscaling the video with a power of 2. For example, if your clip is 1280×720 and your screen 1920×1080, the video gets upscaled to 2560×1440. That means “someone” still needs to downscale it. In that case, the “dscale” you set up.

FSRCNN:
Important: The “FSRCNN” shader is a requirement for that: CLICK HERE.

glsl-shader="C:\mpv\Shaders\FSRCNN_x2_r2_16-0-2.glsl"
scale=ewa_lanczos
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")

nnedi3:
Important: The “nnedi3” shader is a requirement for that: CLICK HERE.

glsl-shader="C:\mpv\Shaders\nnedi3-nns32-win8x4.hook"
scale=ewa_lanczos
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")
no-scaler-resizes-only (fixing the pixel shift

Higher “nns” means more neurons (better quality).
Don’t use “win8x6”, always use “win8x4”.

ravu:
Important: The “ravu” shader is a requirement for that: CLICK HERE (if you’ve gpu-api=opengl) or CLICK HERE (if you’ve gpu-api=vulkan).

glsl-shader="C:\mpv\Shaders\ravu-r4.hook"
scale=ewa_lanczos
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")
no-scaler-resizes-only (fixing the pixel shift)
glsl-shader="C:\mpv\Shaders\ravu-lite-r4.hook"
scale=ewa_lanczos
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")
no-scaler-resizes-only (fixing the pixel shift)
glsl-shader="C:\mpv\Shaders\ravu-zoom-r4.hook"
scale=ewa_lanczos
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")
no-scaler-resizes-only (fixing the pixel shift)

Higher “r” means higher radius (better quality), but also slower performance.

ravu-lite-4: Faster and sharper than ravu-r4, but like FSRCNN it tends to oversharp aliasing and creates some halos/ringing.
Comparison: https://slow.pics/c/XjPJrhTr | It’s up to you what you rather prefer.
ravu-zoom-r4: Decent sharpness with better results than ravu-r4, but much slower.

(without addition)= only luma
-chrome = only chroma
-yuv = luma and chroma
-rgb = same as “yuv” but different color encoding system

(2*)

SSimDownscaler:
Important: The “SSimDownscaler” shader is a requirement for that: CLICK HERE.

glsl-shader="C:\mpv\Shaders\SSimDownscaler.glsl"
dscale=gaussian
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")

(3*)

KrigBilateral:
Important: The “KrigBilateral” shader is a requirement for that: CLICK HERE.

glsl-shader="C:\mpv\Shaders\KrigBilateral.glsl"
cscale=mitchell
fbo-format=rgba16hf (rgba16f for "gpu-api=opengl")

Anti-Ringing:

For an explanation what anti-ringing is, click HERE.

#Luma upscale deringing (Higher = Less rining, but more detail loss)
scale-antiring=0.7

#Luma downscale deringing (Higher = Less rining, but more detail loss)
dscale-antiring=0.7

#Chroma upscale deringing (Higher = Less rining, but more detail loss)
cscale-antiring=0.7

Interpolation:

For an explanation what interpolation is, click HERE.

#Subtitle blending in scenechanges (smoother effect)
blend-subtitles=yes

#Set the fps as the max. of your monitor Hz (only useful and needed with "interpolation=yes)
video-sync=display-resample

#Activate interpolation
interpolation=yes

#Interpolation method [look at the table below]
tscale=...

If you have playback issues, deactivate interpolation.

Smoothness/Sharpness Interpolation
Sharpest oversample
Sharper linear
Sharp catmull_rom
Smooth mitchell
Smoother gaussian
Smoothest bicubic

A different approuch might be using “box ” which gives you a better selection. This method also gives you better results, but it’s slower than all others above.

tscale=box
tscale-window=quadric #(or "sphinx")
tscale-radius=1.0 #lower (e.g. 0.955) = sharper; higher (e.g. 1.005) = smoother 
tscale-clamp=0.0

HDR

HDR output only works with Windows.
For displaying HDR content you’ve to change/add the following commands:

gpu-context=d3d11
gpu-api=d3d11
hwdec=no
dither-depth=no
d3d11-output-csp=pq
blend-subtitles=no
fs

You’ve to turn HDR “On” on your operation system as well:

hdr
Note: Make sure your TV has at least 600 Nits (1000+ Nits are optimal) and a true 10bit panel and not just “8bit+FRC” (fake HDR). HDMI 2.1 is recommended for at least 60Hz 4:4:4/RGB 10bit. With HDMI 2.0 you’ve to lower the Hz of your TV to 30 or change the colour format to 4:2:2/4:2:0 to make it work with 10bit.


HDR -> SDR:

Use this if you want to display HDR content on a SDR screen or dislike the “effect” of HDR.

#Method of converting HDR to SDR
#Good alternatives are: "mobius" or "reinhard" tone-mapping=hable

Profiles:

Important: The “Auto-Profiles” script is a requirement for that.

#You can set up functions like debanding automatically for some sources
#Every profiles thats with a name [TestProfile]
#Then you add a condition - String match p.filename, "" is the interesting part here
#There are also other conditions, but doing it by string with filename is the easiest one
#For this example it will detect everything with the name "TestFile" in it

[TestProfile]
profile-cond=string.match(p.filename, "TestFile")~=nil
deband=yes

[TestProfile-Revert]
profile-cond=string.match(p.filename, "TestFile")==nil
deband=no

In some cases where you need special characters like “-“, you’ve to use “%” for recognizing it as a character and not function:

[Test-Profile]
profile-cond=string.match(p.filename, "Test%-File")~=nil
deband=yes

There also also much more ways, here are some example profiles:

[yuv420source]
profile-desc=cond:((p["video-params/pixelformat"] == "yuv420p10" or p["video-params/pixelformat"] == "yuv420p"))
glsl-shader="C:\mpv\Shaders\KrigBilateral.glsl"

[not1080pbut720pOrHigher]
profile-desc=cond:((p["video-params/h"] >= 720 and p["video-params/h"] < 1080))
glsl-shader="C:\mpv\Shaders\FSRCNN_x2_r2_16-0-2.glsl"
scale=ewa_lanczos
fbo-format=rgba16hf