mpv 是一款 神似 vim 的 媒体播放器,就是说第一眼有点劝退,配置项很多,但如果能花点时间进行配置还是挺香的,而且可以写脚本实现各种功能。
自从开始用 Linux 后我一直用的是 vlc,但总感觉有点捞(,最明显的是在暂停继续 / 快进后退时,经常会卡几秒,而且不是卡住不动而是边放边卡,感觉非常神秘,不知道能不能修,反正我之前简单搜过没修好。而 mpv 默认就没有这样的问题,早就想用了,但之前被它简陋的 UI 以及复杂的配置劝退了,拖到现在才入坑。
完整配置:ouuan/dotfiles/.config/mpv
入坑
参考资料
- mpv - ArchWiki
/
usr / share / doc / mpv / - Reference Manual - mpv.io (
man mpv
) - ChatGPT
配置文件
~/.
: 主配置文件config / mpv / mpv . conf ~/.
: key binding 配置config / mpv / input . conf ~/.
: 脚本,放里面就会运行config / mpv / scripts / ~/.
: 脚本的配置,例如config / mpv / script - opts / ~/.
config / mpv / script - opts / osc . conf /
: 一些自带的脚本,可以 symlink 到usr / share / mpv / scripts / ~/.
config / mpv / scripts /
有个冷知识 (?) 可以注意一下:
Every flag option has a no-flag counterpart, e.g. the opposite of the
--fs
option is--no-fs
.--fs=yes
is same as--fs
,--fs=no
is the same as--no-fs
.
输出
其实我不是很懂这些,但这两天进行各种尝试的感觉是,少配点吧,默认挺好的(
输出质量
profile=gpu-hq
profile=vo-gpu-high
[vo-gpu-high]
vo=gpu
scale=ewa_lanczossharp
cscale=ewa_lanczossharp
video-sync=display-resample
interpolation=yes
tscale=oversample
[vo-gpu-low]
vo=gpu
scale=spline36
cscale=spline36
video-sync=display-resample
interpolation=no
参考 High quality configurations - mpv - ArchWiki。
scale
和 cscale
是用于 upscale,片源分辨率低于显示器才有用,虽然 ewa_
性能开销较大,但只用于低分辨率就还好。和 spline36
在视觉上的差异几乎没有,性能不够就别用,性能够的话用不用都行。
interpolation 可以参考 Interpolation · mpv Wiki,tscale
不会造成 “soap opera effect”
如果播放一些高码率视频,可能会性能不够,所以可以两个 profile 切换。
gpu-next
[vo-gpu-next]
vo=gpu-next
scale=spline36
cscale=spline36
video-sync=audio
interpolation=no
这个最直接的作用是可以读取 Dolby Vision metadata,不会出现颜色错误之类的。
但还是不太稳定,scale
可能会偶尔黑屏,video
会闪屏。
可以设个快捷键切换,需要 cycle
。
G script-message cycle-commands 'apply-profile vo-gpu-low ; show-text "vo gpu-low"' 'apply-profile vo-gpu-next ; show-text "vo gpu-next"' 'apply-profile vo-gpu-high ; show-text "vo gpu high"'
硬件解码
hwdec=auto-safe
hwdec
可以实测一下来看要不要开,之前我测的时候结果变化还挺大的,感觉主要是 CPU 连续工作一段时间性能会下降,而且不同视频效果也不同,可以设 key binding 控制开关,实时看 stats。
g cycle-values hwdec no auto-safe i script-binding stats/display-stats-toggle
音量均衡
af=loudnorm
n cycle-values af "" loudnorm
以前听歌和看视频之间切换时经常要调音量,加上这个就好了。
快捷键
key binding 很看个人习惯,可以对着 /
修改。如果没啥习惯可以直接用默认的。
虽然感觉没太大参考价值,但是:input.conf · ouuan/dotfiles。
避免误触未知快捷键
no-input-default-bindings
这个可能会影响通过脚本设置快捷键,如果不想影响脚本可以 no
。
右键菜单
Thomas Carmichael / mpvcontextmenu · GitLab
把 mpvcontextmenu
文件夹放进 scripts
。需要安装 gjs
。
MBTN_RIGHT script-message mpv_context_menu_gtk
调整字体:
# script-opts/menu-engine.conf
fontFace=monospace
fontSize=15
它附带了通过 GUI 打开文件的功能:kdialog
或 zenity
)
# script-opts/gui-dialogs.conf
dialogPref=kdialog
o script-binding add_subtitle_dialog O script-binding add_audio_dialog Ctrl+o script-binding add_files_dialog Ctrl+O script-binding append_files_dialog
快进
长按 → 快进。
RIGHT script-binding fast-forward
每根毛都看得清清楚楚
用鼠标放大、拖拽画面。
mpv
Ctrl+WHEEL_UP script-message cursor-centric-zoom 0.1 Ctrl+WHEEL_DOWN script-message cursor-centric-zoom -0.1 Ctrl+MBTN_LEFT script-binding drag-to-pan r script-message rotate-video 90 R script-message rotate-video -90
no-window-dragging # for drag-to-pan
选择 track
裸的 mpv 添加 / 选择 track 很不方便,有了 mpvcontextmenu
就好很多了,但我在发现它之前就自己写了两个脚本,现在有了它就把添加文件的删了,但选择 track 还是保留下来。
顺便还会在打开文件时检测当前是否是双声道,如果不是(例如是环绕声)则弹出音轨选择。
t script-binding select-subtitle T script-binding select-audio Ctrl+t script-binding select-video
重置设置
我这里只重置了会被我的 key binding 修改的设置。
Ctrl+0 apply-profile reset-all ; show-text 已重置所有设置
[reset-all]
profile-desc="重置所有设置"
volume=100
mute=no
speed=1
brightness=0
video-zoom=0
video-pan-x=0
video-pan-y=0
video-rotate=0
sub-visibility=yes
sub-scale=1
sub-pos=100
audio-delay=0
ab-loop-a=no
ab-loop-b=no
听歌
播放列表管理
jonniek/mpv-playlistmanager: Mpv lua script to create and manage playlists
P script-binding showplaylist
key_moveup=k UP
key_movedown=j DOWN
key_movepageup=Ctrl+u PGUP
key_movepagedown=Ctrl+d PGDWN
key_movebegin=^ 0 HOME
key_moveend=$ END
key_selectfile=d-d
key_unselectfile=p
key_playfile=l ENTER
key_removefile=x BS
key_closeplaylist=ESC P h
showamount=20
text_padding_y=15
curtain_opacity=0.3
style_ass_tags={\fs11}
slice_longfilenames=yes
slice_longfilenames_amount=120
其他都还好,这个 dd
/ p
确实太 Vim 了(
播放模式
我是觉得下面这几种播放模式比较常用(列表循环不太常用),而看视频时一般播完暂停比较好,作为默认。随机播放/单曲循环的时候一般不需要保存播放进度。
profile=playmode-pause
[playmode-pause]
profile-desc="播完暂停"
keep-open=always
loop-file=no
loop-playlist=inf
shuffle=no
save-position-on-quit
[playmode-shuffle]
profile-desc="随机播放"
keep-open=yes
loop-file=no
loop-playlist=inf
shuffle
no-save-position-on-quit
[playmode-loopfile]
profile-desc="单文件循环"
keep-open=yes
loop-file=inf
loop-playlist=inf
shuffle=no
no-save-position-on-quit
[playmode-playall]
profile-desc="顺序播放"
keep-open=yes
loop-file=no
loop-playlist=no
shuffle=no
save-position-on-quit
另外可以加一个 no
,播完暂停时后退不会暂停。
快捷键切换:
p script-message cycle-commands "apply-profile playmode-shuffle ; playlist-shuffle ; show-text 随机播放" "apply-profile playmode-loopfile ; playlist-unshuffle ; show-text 单曲循环" "apply-profile playmode-playall ; playlist-unshuffle ; show-text 顺序播放" "apply-profile playmode-pause ; playlist-unshuffle ; show-text 播完暂停"
playerctl
装了 mpv-mpris 就可以用 playerctl
了。
关闭所有 mpv:killall
也行就是比较暴力)
alias stopplay='playerctl -a -p mpv stop'
用 i3 的话,可以利用 playerctl 设快捷键,用 bumblebee
的 playerctl
module 显示正在播放的媒体信息。
从命令行播放音乐
我一般都是用若干 alias 来从命令行播放音乐(所以很少在网易云上听(
play() {
stopplay >/dev/null 2>&1
bk mpv --profile=playmode-shuffle --no-video --no-resume-playback "$@"
}
alias playjp='play ~/Music/日本語の歌/'
...
其中 bk
是一个我用了很多年的小 trick:
bk_noalias() {
nohup "$@" </dev/null >/dev/null 2>/dev/null &
disown
}
alias bk='bk_noalias ' # alias 末尾空格可以继续接 alias
杂项
OSC
显示总时长而非剩余时长:
# script-opts/osc.conf
timetotal=yes
全屏时移动鼠标显示 OSC,非全屏时一直显示且不遮挡画面:
# script-opts/osc.conf
# it does nothing when visibility is not always
boxvideo=yes
# mpv.conf
[osc-not-fullscreen]
profile-cond=not fullscreen
script-opts=osc-visibility=always
[osc-fullscreen]
profile-cond=fullscreen
script-opts=osc-visibility=auto
autoload
打开一个文件时自动加载同目录下的其他文件。
ln -s /usr/share/mpv/scripts/autoload.lua ~/.config/mpv/scripts/
(其实 playlistmanager 也可以启用这个功能,只不过官方有维护 autoload
就用官方的吧。)
自动找 track
模糊匹配字幕和音轨文件:
sub-auto=fuzzy
audio-file-auto=fuzzy
OSD
osd-on-seek=msg-bar
osd-playing-msg="File: ${filename}"
osd-duration=2000
快进后退的时候显示一下具体位置;切换文件时显示一下文件名;显示久一点。
截图
screenshot-directory=~/screenshots
screenshot-template="%F - %P - %#01n"
截图文件名是视频文件名 + 时间戳 + 版本(有了版本可以同一个位置截多张图,进行对比)。
暂停图标
试过在暂停的时候显示一个图标,后来还是觉得去掉好一点,改成了 osd-msg cycle pause
。
想要的话可以参考 @CogentRedTester - OSD-info when video is paused。需要注意的是这里用到了 “⏸”,而 color emoji 会显示为乱码,只能用 monochrome emoji,可以装一个 Noto Emoji Monochrome 加在 fontconfig 里。
在线播放
mpv 使用了 yt-dlp,可以直接播放很多视频网站的视频/直播,yt-dlp 还可以直接从浏览器获取 Cookies:
ytdl-raw-options=cookies-from-browser=firefox
WakaTime
有点逆天,但是怎么不行呢((
本来是想着写个记录播放历史,但感觉有点肝不动,然后想到了 WakaTime(
和记录代码不用同一个账号就不会污染数据了,可以建个新文件夹作为 mpv 的 WAKATIME_
。
拆分 mpv.conf
配置都写在一起感觉最大的问题在于 profile 要写最底下,导致不能把不同板块的配置完全拆开。可以用 include
来拆成多个配置文件。
include=~~home/conf.d/output.conf
include=~~home/conf.d/playmode.conf
include=~~home/conf.d/osc.conf
...
注意 ~~home/
是 mpv home,~/
才是 $HOME
。
directory-specific config
exrc.lua
(写得比较粗糙,能用就行(
mpv 提供了 “File-specific Configuration Files” 功能,但是它不安全。受 More secure .exrc (.nvimrc) handling · Issue #20911 · neovim/neovim 启发,可以在加载 exrc 前询问用户。
(我是学日语的时候听教材音频,想自动切成单曲循环。)