配置预设#

ver.20231101

#

阅读本文前默认已基本熟悉 mpv.conf 内各参数的用途及含义。

关联官方手册部分 Manual_profiles

“profile” 没找到完美的翻译来避免中文的语义歧义(在mpv-lazy中我习惯性将其称为“配置预设”),为了避免认知偏差,本文使用英文原文。

示例配置#

首先,从如下的例子开始,逐步解析 profile ——

### mpv.conf 内容

vo=gpu
hwdec=yes
profile=high-quality
deband=no
keep-open=yes
profile=srt_style


[srt_style]
sub-scale-with-window=no
sub-font-size=58
sub-border-size=4


[playing_ontop]
profile-desc=播放时置顶
profile-cond=not pause
profile-restore=copy
ontop=yes

1.顺序逻辑#

在一个主设置文件中,使用参数 profile=xxx 即插入某profile,而profile本身是一个参数集合(不会在启动时应用)
依照整体逻辑,从上往下读取。对于一般选项,如果存在重名的则后者覆盖前者成为实际被应用的参数。
其中 profile=xxx 是一个特殊选项,当它被读取时,会被解析为它的赋值对象中的实际参数集。

[xxxxx] 是一个profile的头部标志,两个profile之间 —— 即 [srt_style][playing_ontop] 所有中间行的参数都属于 [srt_style]
一旦你在 mpv.conf 自己建立了profile,就不要把常驻参数(即启动时就应用的项)写在profile的后方,因为profile没有明确的结束标志,在上方示例中,任何写在最后的参数都会被mpv认定为属于 [playing_ontop]

high-quality 是mpv内建(自带)的一个profile(旧版mpv中是 gpu-hq ),它具体包含以下参数:

scale = ewa_lanczossharp
hdr-peak-percentile = 99.995
hdr-contrast-recovery = 0.30
deband=yes

P.S. mpv还有其它内建profile,详见 《profiles_补充内容》

因此,上方示例实际被解析为如下常驻参数列表 ——

### 常驻参数
vo=gpu
hwdec=yes

scale = ewa_lanczossharp
hdr-peak-percentile = 99.995
hdr-contrast-recovery = 0.30
deband=yes

deband=no
keep-open=yes
sub-scale-with-window=no
sub-font-size=58
sub-border-size=4

P.S. 在此示例中,把 deband=no 放在 profile=high-qualit 之后,也是因为目的是要禁用去色带,否则如果顺序相反只会产生相反的结果。

2.分类#

profile可大致分为 常规/普通profile 和 条件/自动profile
简单概括特性即 条件profile 会根据内部设定的触发条件,满足情况时自动启用

区分的依据是内部的构成 ——

### 常规profile的结构
[ass_vsfilter_cmpt]                  # profile的名称,自定义
profile-desc=ass的vsfilter兼容测试   # [非必要参数] profile的描述,自定义
sub-ass-vsfilter-aspect-compat=no    # 此行往后填写要你要应用的参数,自定义
sub-ass-vsfilter-blur-compat=no
sub-ass-vsfilter-color-compat=no
### 条件profile的结构
[idle_border]                     # profile的名称,自定义
profile-desc=非空闲时使用无边框   # [非必要参数] profile的描述,自定义
profile-cond=not p.idle_active    # profile的触发判定条件
profile-restore=copy              # 不满足时的回退方式
border=no                         # 此行往后填写要你要应用的参数,自定义

2.1.条件profile的深入解释#

2.1.1.cond#

首先是有哪些触发条件即 profile-cond 可用,它被解释为Lua条件,即使你完全不了解这门语言,这里亦有示例带你快速入门使用。

判定的核心对象是 “属性” 即手册中的属性列表中列出的全部,
一个安全的引用属性的方式是 p["xxxx"] ,这样就不用担心特殊符号导致的判定无效。

  • 若只需满足一个属性,对应条件就这样写: p["xxxx"]

  • 若只需满足一个属性的反面,对应条件就这样写: not p["xxxx"]

  • 若需满足两个属性,对应条件就这样写: p["xxxx"] and p["yyyy"]

  • 若需某个属性的等于某个具体值时触发,对应条件就这样写: p["xxxx"]=="value"

  • 若需某个属性值(数字)大于等于某数值时触发(以音量为例),对应条件就这样写: p["volume"]>=50

P.S. 更多示例参见 主仓库_profiles

P.S. 常见的引用属性的方式是直接写属性名和 p.xxxx 的形式(参见前文的示范),这种方式适合名字简单无符号的属性,不用担心语法上的暗病。

2.1.2.restore#

其次是profile触发后,不满足条件时的回退方式。

正如开头讲,profile被解析为具体一行行参数,因此准确讲profile并没有开启和关闭的概念。为了解决现实的需求,它以变通的方式解决了这个问题,即备份触发前的涉及的选项及其值,然后在条件不满足是还原备份的参数。

对应“回退方式”的即 profile-cond 它的常用可选值为 defaultcopy
如果使用 default ,则没有“回退”处理。它的实用场景较少,因此常见的几乎都是使用 copy

3.非典型使用#

3.1.旧版的自动profile#

mpv遗留了一种旧版的 自动profile ,如下所示

### Legacy auto profiles的结构
[extension.mp4]                    # profile的名称,亦是profile的触发判定条件(回退方式类似 copy)
profile-desc=mp4扩展名文件的处理   # [非必要参数] profile的描述,自定义
hwdec=auto                         # 此行往后填写要你要应用的参数,自定义

它的功能有限,通常没有使用的必要而且可以转换为当前的 条件profile ,这在之前的 《profiles_补充内容》 有记录。

3.2.profile嵌套#

如图所示,注意书写顺序,确保后方的profile所调用的profile已被读取到。

[deband_base]
deband=yes
deband-iterations=2
deband-threshold=48

[deband_plus]
profile=deband_base
deband-range=10
deband-grain=24

[deband_auto]
profile-cond=fullscreen
profile-restore=copy
profile=deband_plus

🔺 注意:不要在 条件profile 里嵌套 条件profile

3.3.隔离profile#

这也是我当前在 mpv-lazy 中的处理方式,避免开头提到的 常驻参数 误入profile的问题。
实现方式是通过在mpv.conf中使用参数 --include=xxxx.conf 这样mpv就会在主设置文件读取完毕后,再读取该文件作为 mpv.conf 的补充内容,而我只在该文件内写profile,常驻参数只写在 mpv.conf 中。

P.S. 我以同样的方式隔离了脚本选项,参见 《集中化管理mpv的脚本选项》

3.4.穿插常驻参数#

如果你执意要在两个profile之间穿插 常驻参数 ,官方亦提供了一种解决方案,见下方示例 ——

### “常驻参数” 区
xxxx=xxxx
xxxx=xxxx
xxxx=xxxx

### “profile参数” 区
[profile_1]
aaaa=aaaa
aaaa=aaaa
aaaa=aaaa

# 使用名为 "default" 的profile即可让这部分的参数被归为 “常驻参数”
[default]
yyyy=yyyy
yyyy=yyyy
yyyy=yyyy

[profile_2]
bbbb=bbbb
bbbb=bbbb
bbbb=bbbb

这种方案带来了附属影响,即 profile=default 原本是空的,而此时被赋予了 yyy... 这部分参数。