配一下 mpv

mpv 是一款 神似 vim 的 媒体播放器就是说第一眼有点劝退配置项很多但如果能花点时间进行配置还是挺香的而且可以写脚本实现各种功能

自从开始用 Linux 后我一直用的是 vlc但总感觉有点捞最明显的是在暂停继续 / 快进后退时经常会卡几秒而且不是卡住不动而是边放边卡感觉非常神秘不知道能不能修反正我之前简单搜过没修好而 mpv 默认就没有这样的问题早就想用了但之前被它简陋的 UI 以及复杂的配置劝退了拖到现在才入坑

完整配置ouuan/dotfiles/.config/mpv

入坑

参考资料

配置文件

  • ~/.config/mpv/mpv.conf: 主配置文件
  • ~/.config/mpv/input.conf: key binding 配置
  • ~/.config/mpv/scripts/: 脚本放里面就会运行
  • ~/.config/mpv/script-opts/: 脚本的配置例如 ~/.config/mpv/script-opts/osc.conf
  • /usr/share/mpv/scripts/: 一些自带的脚本可以 symlink 到 ~/.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

scalecscale 是用于 upscale片源分辨率低于显示器才有用虽然 ewa_lanczossharp 性能开销较大但只用于低分辨率就还好spline36 在视觉上的差异几乎没有性能不够就别用性能够的话用不用都行

interpolation 可以参考 Interpolation · mpv Wikitscale=oversample 不会造成 soap opera effect如果用 SVP 就可能会有可以找个人物动作之类的片段开 A-B loop 对比

如果播放一些高码率视频可能会性能不够所以可以两个 profile 切换

gpu-next

[vo-gpu-next]
vo=gpu-next
scale=spline36
cscale=spline36
video-sync=audio
interpolation=no

这个最直接的作用是可以读取 Dolby Vision metadata不会出现颜色错误之类的可以用 4K Dolby Vision video test 测试

但还是不太稳定scale=ewa_lanczossharp 可能会偶尔黑屏video-sync=display-resample 会闪屏

可以设个快捷键切换需要 cycle-commands.lua

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 很看个人习惯可以对着 /usr/share/doc/mpv/input.conf 修改如果没啥习惯可以直接用默认的

虽然感觉没太大参考价值但是input.conf · ouuan/dotfiles

避免误触未知快捷键

no-input-default-bindings

这个可能会影响通过脚本设置快捷键如果不想影响脚本可以 no-input-builtin-bindings

右键菜单

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 打开文件的功能需要安装 kdialogzenity

# 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

快进

长按 快进

fast-forward.lua

RIGHT           script-binding fast-forward

每根毛都看得清清楚楚

用鼠标放大拖拽画面

mpv-image-viewer/scripts/image-positioning.lua

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 还是保留下来

顺便还会在打开文件时检测当前是否是双声道如果不是例如是环绕声则弹出音轨选择

select-track.lua

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-keep-open-pause播完暂停时后退不会暂停

快捷键切换

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-statusplayerctl 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.lua 就用官方的吧

自动找 track

模糊匹配字幕和音轨文件实际上也没有多 fuzzy只是部分匹配而已

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.lua

有点逆天但是怎么不行呢(

本来是想着写个记录播放历史但感觉有点肝不动然后想到了 WakaTime

和记录代码不用同一个账号就不会污染数据了可以建个新文件夹作为 mpv 的 WAKATIME_HOME

拆分 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 前询问用户

我是学日语的时候听教材音频想自动切成单曲循环