▷ ▲ ▼ ◁
我最初接触到这个开源世界中的多媒体播放器,源于我对Windows平台自带的本地播放器功能羸弱的不满,没错!说的就是你,Windows Media Player!暂且不说可解码的多媒体格式较为有限,在我使用过程中经常会出现快速消耗计算资源和响应慢的情况,终于有一天我忍无可忍了 (╯▔皿▔)╯┻━┻ ,强忍着想要卸载WMP的冲动,决定要找一个合适的继任者。于是我试过一些“轻量级”国产本地播放器,嗯,夹带私货无硬解,整体功能华而不实,鬼!要不试试大佬推荐的PotPlayer、VLC?好,整体功能无懈可击,不过只是作为本地播放器有点大材小用,对不住了。有没有一款足够纯粹、简约、高效的本地播放器呢?搜索引擎的建议是:MPV
。。。MPV不是汽车吗?搁这儿给我推车载音乐播放器是吧?随后我就看到了一行简介:
mpv is a free (as in freedom) media player for the command line. It supports a wide variety of media file formats, audio and video codecs, and subtitle types... —— https://mpv.io
mpv是一款针对命令行、免费且自由的(自在自由)多媒体播放器。它支持诸多的媒体文件格式、音频和视频编解码器,以及字幕类型……抱着试试看的态度,逐步摸索着开始了“养成计划”,所以我就简单地记录这一年来地使用体验。不过我得提前说明的是,mpv并不是解决这类问题的最优解,这一点我必须得承认,因为它和vim一样都是“养成类”工具,需要你有足够的耐心和时间。再打个比方,mpv的目标受众和ArchLinux类似,欢迎入教(bushi。如果你需要的是符合国人操作习惯,同时拥有华丽界面和丰富网络功能的播放器,那么国产一般都能满足;如果你具有基本的动手能力和计算机技术常识,同时想要自己的播放器是神一样存在的话,那么PotPlayer、VLC将赐予你神力。如果你和我一样需要的只是“纯粹”,那么欢迎你入坑mpv,准备好面对疾风吧! []~( ̄▽ ̄)~*
◤ ◣ ◢ ◥
与其说MPV Player是一个完整的多媒体播放器,倒不如说是播放器核心,它是那么的纯粹与简约,纯粹到连一个像样的GUI界面都“没有”,简约到连播放列表都不提供!几乎是所有地操作都需要通过快捷键、编写相应配置文件的方式才能正常执行,搞我心态呢这是 (⊙x⊙;)!实话实说,我第一次遇到这样“纯粹”的播放界面,简直“感动”的要哭了,放几张截图体会一下

mpv player默认osc启动界面

mpv player默认osc播放界面,背景是音乐专辑自带的封面,默认只有黑色背景!
不过也不能责怪mpv,项目官网上明确注明了这是一个专为命令行界面而生的播放器,GUI并不是它努力的方向,而且有很多其他的项目是基于MPV Player完善和创新了GUI功能,进而丰富了mpv社区,所以你可以认为官方的MPV Player只是一个播放器内核,而这个其貌不扬的播放器拥有的是强大且丰富的编解码能力、多媒体播放功能,以及高度自由的可定制化特性(高情商:高度自由可定制,低情商:一穷二白纯手工),果然人不可貌相!
MPV Player的这种“孤僻”性格就注定造就了它在普通用户中的影响力微乎其微,所以仅有极少部分有技术、爱折腾的用户可以说是能够熟练的掌控它(可惜我不是)。先从获取软件包安装开始,官方的建议是使用Git克隆master分支代码自行编译构建,不过项目官网的下载页面(https://mpv.io/installation/)也提供了大量第三方构建包网址,包含Windows、Mac OS、Linux、Android以及BSD平台,真正体现了跨平台的特性。Windows平台编译源码比较困难,所以直接用第三方构建包,如果是GNU/Linux平台可以试试从源码开始编译构建。
软件本体所在根目录大致是这样,其中 installer/ 目录下的批处理文件最主要的作用是添加文件格式关联,doc/ 目录中的文件是使用手册和默认的功能按键绑定示意图。不过在我看来文件格式关不关联无所谓,在桌面生成快捷方式也很简单,相反最重要的是能够看懂使用手册和默认快捷键位布局。所以从现在开始需要适应这种一切依靠键位操作的方式,同时这些功能对应的键位设置也是可以根据自身使用习惯进行自定义的。

mpv是直接可以运行,文件格式关联可选

文件格式关联和生成桌面快捷方式

纯英文使用手册
最开始需要记忆的无非是几个常用功能对应的快捷键,比如说像播放/暂停、上下切换、音量调节、播放倍速调节之类的,其他功能可以慢慢记忆和适应,这也是高学习成本的表现。
等到熟悉所有的键位操作形式之后,就可以进入更深层次的把玩阶段了,学习使用配置文件来提升你的mpv使用体验。Windows平台下对应的配置文件路径是 %AppData%\mpv\ ,或者直接在软件本体的同级目录中创建名为 portable_config 配置目录当作便携版来使用,通过“win+r”调起运行进入,其他平台,例如GNU/Linux一般在 %HOME%/.config/mpv/ 。如果目录不存在的话可以自行创建,同时创建好预定的几个.conf文件和子目录,便于后续存放和编辑配置信息。mpv.conf 定义了mpv的一些功能特性,input.conf 定义了有关键鼠功能映射的信息,watch_later/ 顾名思义是保存最近一次观看记录与设置的目录(实际使用过程中会出现一些问题),scripts/ 存放用户自定义脚本,script-opts/ 与内置或第三方lua脚本的设置有关。

shaders 是我用来存放 Anime4K 插件的目录
根据自己的使用习惯,结合使用手册中的说明对以上配置文件进行调整即可实现自定义,培养成专属于你的MPV Player,以我的配置为例,带#为注释,~~/ 表示按配置目录作为当前根目录:
# ~~/mpv.conf
##########################################################
## MPV Player基本配置
##
## 注意事项:
## '#'开头表示注释或未使用的配置项
## 删除/添加'#'以启用/禁用该行配置项
## 播放器默认行为基本满足大部分使用场景
## 删繁就简,避免引入与播放器默认行为重复或废弃的配置项
##
##########################################################
#########################
# 视频/音频/字幕轨配置项
#########################
# 指定优先使用的字幕语言,越往后优先级越低
slang=zh-CN,zh-Hans,chs,chi,en,en-US,eng,ja,ja-JP,jpn
# 指定优先使用的音频轨语言,越往后优先级越低
alang=ja,ja-JP,jpn,en,en-US,eng,zh-CN,zh-Hans,chs,chi
#################
# 播放行为配置项
#################
# 播放列表循环方式,只有一个文件时循环该文件,有多个文件时则列表循环
# loop-playlist 等同于 loop-playlist=inf
loop-playlist
# 切换到下一个文件时重置暂停模式
# 如果原先处于暂停状态,则在跳转至下一个文件时恢复播放
reset-on-next-file=pause
######################
# 视频解码/渲染配置项
######################
# 使用GPU解码视频
vo=gpu
# 视频硬件解码API选择,自动选择白名单中可信任的硬解方案
hwdec=auto-safe
# 使用所有可用的硬解码格式
hwdec-codecs=all
#############
# 音频配置项
#############
# 设定程序启动后默认音量
volume=50
# 播放音频文件时优先显示含有内嵌封面的图像(默认行为)
#audio-display=embedded-first
# 音量最大值设定(范围100%-1000%,默认为130%)
volume-max=150
# 加载视频文件的外部音频文件方式(加载含有视频文件名的全部音频文件)
audio-file-auto=fuzzy
#############
# 字幕配置项
#############
# 加载视频文件的外部字幕文件方式(加载含有视频文件名的全部字幕文件)
sub-auto=fuzzy
# 尝试从相关的字幕目录中搜索外部字幕文件并加载
sub-file-paths=sub;subs;ass;srt;subtitles
#####################
# 软件窗口/OSD配置项
#####################
# --geometry=<x:y>
# 启动播放器时,将窗口置于屏幕中心
geometry=50%:50%
# --autofit=<[W[xH]]>
# 初始化播放器窗口宽度自适应为屏幕宽度的60%,并保持窗口横纵比
autofit=60%
# 自定义窗口标题
# 附加暂停⏸/静音🔇/窗口置顶📌状态标识到媒体标题/文件名/No file之前
# 状态指示可叠加且按条件判断顺序显示
title="${?pause==yes:⏸ }${?mute==yes:🔇 }${?ontop==yes:📌 }${media-title:No file} - mpv"
# 仅限Windows平台,临近屏幕边缘自动吸附
#snap-window
# 只在全屏模式下自动隐藏鼠标
cursor-autohide-fs-only
# 1秒后自动隐藏鼠标
cursor-autohide=1000
# 开始播放时在OSD左上角显示正在播放的文件信息
osd-playing-msg='Playing: ${filename}\nPos/Tol: ${playlist-pos-1}/${playlist-count}'
# 设置OSD信息显示时间间隔,默认1000ms,配合osd-playing-msg使用
osd-duration=3000
# 指定OSD字体大小,默认55
osd-font-size=36
#######################
# 幻灯片自动放映配置项
#######################
# --image-display-duration=<seconds|inf>,默认间隔1s
# inf表示直到用户手动切换前保持放映
image-display-duration=3
#############
# 截图配置项
#############
# 截图文件格式
screenshot-format=png
#################
# 稍后再看配置项
#################
# 退出前记忆本次播放位置
#save-position-on-quit=yes
# 稍后在看仅记录文件名,忽略文件所在路径
# 作用:同一文件移动至其他目录时仍可恢复原先的播放记录
# 副作用:不同路径下的多个同名文件会被误识别为同一文件
#ignore-path-in-watch-later-config
# 将暂停状态从稍后再看记录中排除,类似的还可以是volume, mute...
#watch-later-options-remove=pause
#############
# 其他配置项
#############
#######################################################################
## 导入Profile策略
##
## 以下导入形式为我个人使用经验总结,并无成文/强制规定
## 1. 目录结构:<Path of mpv.conf>/<profiles dir>/<your profile files>
## 2. 一项profile或同一使用场景策略对应一个配置文件
## 3. 文件名与策略项命名保持一致,即 filename = [profile]
## 4. 需要用多少就导入多少,非必要不导入或则注释掉
##
#######################################################################
# 在线视频/网络直播流缓存策略配置项
# --profile=live-streaming 启用该项策略
include="~~/profiles/live-streaming.conf"
有关键鼠功能映射的配置相对较少,主要是我习惯了默认的映射布局,所以不再做大量更改,如果你是从其他播放器平台转移而来,可以继续自定义成原先平台使用的组合方式:
# ~~/input.conf
##############################
# MPVPlayer键鼠功能映射配置项
##############################
#####################
# 鼠标功能映射设置项
#####################
# 鼠标滚轮向前滚动增加音量2
WHEEL_UP add volume 2
# 鼠标滚轮向后滚动减少音量2
WHEEL_DOWN add volume -2
################################
# Anime4K着色器优化方案键位映射
################################
# Anime4K v4.0.1 (stable),当前配置适用于中低端GPU,且播放默认不会自动采用任何着色器方案
# Anime4K v4.x拥有3种主要的优化模式:模式A,B和C,以及3种与之相对应的辅助模式:模式A+A,B+B,C+A
# 想要启用其中的一种模式,按下CTRL+1启用模式A,CTRL+2启用模式2依此类推。CTRL+0会清除和禁用所有的着色器
# 每种模式都针对不同类别的动漫退化进行了优化,当前你可以尝试着每种模式(从模式A开始),然后选择一个效果看起来最佳的模式
# 如果想要获得更高的感知质量,可以尝试使用主模式对应的辅助模式
# 注意:辅助模式应仅在x2或更高的比率下使用,如果屏幕为1080p,则在1080p动漫上使用模式A将提高图像质量,但使用模式A+A很可能会过度锐化并降低图像质量
# 模式A
# 优化对象:大多数1080p动漫,一部分老旧的720p动漫,大多数古老的SD动漫,画面存在大面积模糊、大量重采样残影和因为压缩导致拖尾的情况
# 预期效果:高感知质量,减少压缩残影,重建强化大多数弱线条,减少画面大面积模糊和噪声
CTRL+1 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_M.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode A (Fast)"
# 模式B
# 优化对象:一部分1080p动漫,大多数720p动漫,1080p往720p缩放的动漫,画面存在少量模糊、部分重采样残影和因为缩放导致清晰度变化
# 预期效果:减少压缩残影,重建强化部分弱线条,减少画面部分模糊、噪声、清晰度和锯齿
CTRL+2 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode B (Fast)"
# 模式C
# 优化对象:1080p往480p缩放的动漫,极少数1080p动漫电影,画面没有退化的图像、壁纸和Pixiv插画
# 预期效果:最高程度的PSNR,减少画面噪声
CTRL+3 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode C (Fast)"
# 同模式A
CTRL+4 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_M.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl;~~/shaders/Anime4K_Restore_CNN_S.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode A+A (Fast)"
# 同模式B
CTRL+5 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Restore_CNN_Soft_S.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode B+B (Fast)"
# 同模式C
CTRL+6 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_M.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Restore_CNN_S.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode C+A (Fast)"
# 引入更低端的GPU渲染方案,前几个方案实在是带不动233,最终效果对应着ABC三种主模式
CTRL+7 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_S.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode D (Fast)"
CTRL+8 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Restore_CNN_Soft_S.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode E (Fast)"
CTRL+9 no-osd change-list glsl-shaders set "~~/shaders/Anime4K_Clamp_Highlights.glsl;~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_S.glsl;~~/shaders/Anime4K_AutoDownscalePre_x2.glsl;~~/shaders/Anime4K_AutoDownscalePre_x4.glsl;~~/shaders/Anime4K_Upscale_CNN_x2_S.glsl"; show-text "Anime4K: Mode F (Fast)"
# 清除当前所有的着色器优化方案
CTRL+0 no-osd change-list glsl-shaders clr ""; show-text "GLSL shaders cleared"
虽然播放器自带的osc(On Screen Controller)简陋归简陋,但看多了也就习惯了,提供给用户的提示信息足够精简,所以我根据自己的使用习惯略微做些改动。同样的,你完全可以禁用默认osc提示界面,只需要在 mpv.conf 中加一项 osc=no 的配置,然后自行使用lua编写osc界面,重新定义包括播放进度、播放标题、音量提示等其他提示信息样式:
# ~~/script-opts/osc.conf
##########################
# OSC/On Screen Controller
##########################
# OSC通过使用存放在mpv用户目录下的 script-opts/osc.conf 配置文件
# 以及 --script-opts 命令行选项,提供了有限的配置方案
# 其中,由命令行提供的选项将会优先覆盖配置文件中的同名配置内容
# 以总时间显示代替剩余时间显示
timetotal=yes
# 若是没有鼠标活动,直至OSC自动隐藏前的这段时长,以ms为单位,不能为负值
# 默认为500ms
hidetimeout=3000
# 以ms为单位的OSC淡出时长,0表示关闭淡出效果
# 默认为200ms
fadeduration=500
# 以毫秒显示时间码
# timems=yes
为了进一步规范不同类别的配置项目录结构,自发布这篇专栏之后从配置文件中逐步剔除若干重复、无效以及废弃的配置项,且本着大道至简的原则,以及践行将MPV Player努力打造成短小精悍的本地播放器的初心,不会轻易引入非必要或实验性质的配置项和第三方插件。同时剥离部分配置项至独立的conf文件中,规范并细分配置项职能,以下为最新分离的profile策略配置,需要自行创建对应的目录结构与配置文件:
# ~~/profiles/live-streaming.conf
##########################################################
# 在线视频/网络直播流缓存策略配置项
# 一定程度上缓解使用MPV Player播放直播流时的内存资源占用
# 同样适用于播放在线视频的使用场景
##########################################################
[live-streaming]
# 启用缓存
cache=yes
# 最大缓存大小
demuxer-max-bytes=64MiB
# 向后最大缓存大小
demuxer-max-back-bytes=32MiB
# 关闭向前借用缓冲机制
#demuxer-donate-buffer=no
# 关闭磁盘缓存,仅使用内存缓存
cache-on-disk=no
关于彩蛋,官方默认的osc启动界面在圣诞节前后会自动“戴上”圣诞帽!
至此有关播放器原生设置相关的内容都已经有所了解和接触,这样的播放器已经完全能够胜任本地播放器的职责。不过似乎还可以让它变得更加出色,自行编写或使用其他开发者编写的第三方功能提升脚本可以让MPV Player拥有更高的可玩性(https://github.com/mpv-player/mpv/wiki/User-Scripts),原生支持JavaScript和Lua脚本。为了尽可能地使播放器专注于自己的第一职责,我仅添加了一个真正意义上播放列表脚本。播放器原生的播放列表只有展示功能,缺少选择播放功能,临时调用原生播放列表有两种方式,右键下一曲或<F8>,再或者当你点击下一曲时也会显示:

其实原生的播放列表也不算太难看,只不过功能是残缺的
于是我在 scripts/ 中添加了一个playlist-navigator脚本(https://github.com/drogers141/mpv-playlist-navigator),简单弥补了原生播放器的不足,其他像是autoload、小窗口预览脚本都可以自行添加:

可以通过修改脚本实现更多自定义样式和行为
◒ ◐ ◕ ◔
其实,MPV Player的“养成计划”远没有到达终点,有太多的功能和彩蛋等着去探索,更高阶的玩法还有着色器渲染之类,总之我现在已经离不开它了 ╰( ̄ω ̄o)。以上所有的配置文件我已经提交至GitHub仓库(https://github.com/GreatRunoob/mpv-configuration),方便大家参考!
参考资料:
https://mpv.io (MPV Player项目官网)
https://github.com/mpv-player/mpv (MPV Player项目Github网址)
https://www.fsf.org/faif/ (Free as in freedom 2.0)
网页链接 (自用MPV播放器.conf文件配置)
https://github.com/mpv-player/mpv/wiki/User-Scripts (第三方用户功能拓展脚本列表)
https://github.com/drogers141/mpv-playlist-navigator (播放列表导航脚本)
https://github.com/GreatRunoob/mpv-configuration (配置文件仓库)