音视频滤镜#
ver.20231101
序#
本文是 mpv进阶的小节4 & 《快捷键自定义与控制台》 的拓展内容。
关联官方手册部分 Manual_filters
本文只以视频滤镜为例进行讲解(音频滤镜的用法完全一致)
滤镜 也常被翻译作 过滤器
默认快捷键 (Shift + ) i 的第一页下方显示已挂载的用户滤镜列表 Filters:
。无挂载则不显示该条目
🔺 尽量使用软解或带复制的硬解(即 --hwdec=no
或 --hwdec=auto-copy
),大多数滤镜无法在原生硬解(即 --hwdec=yes
)下工作
本文偏重写法而不是实际用途,推荐熟悉语法后再查看 《实用向的滤镜》 中的诸多案例。
1.语法简述#
通常可以通过 --vf
选项使用视频滤镜
滤镜存在列表管理的性质,因此有不同的后缀可搭配 ——
后缀 |
含义 |
---|---|
set |
设置滤镜链(多个滤镜之间使用半角逗号 , 作为分隔符) |
append |
追加单个滤镜(在后方) |
add |
追加单个或多个滤镜(在后方) |
pre |
追加单个或多个滤镜(在前方) |
clr |
移除所有滤镜 |
remove |
移除指定的滤镜 |
toggle |
追加指定的滤镜(在后方),但如果已经存在则移除该滤镜 |
help |
仅支持在终端使用,用于输出该滤镜的更多信息 |
先不考虑后缀,插入滤镜的语法为:
挂载某个滤镜(最简最基础)
vf=滤镜名
挂载某个滤镜时对其中的子参数进行指定
vf=滤镜名=子参数1:子参数2
挂载多个滤镜的最简方式
vf=滤镜1,滤镜2
挂载某个滤镜时手动打上 标签
vf=@标签名:!滤镜名
🔺 标签的用途之一是便于管理,例如手动插入一个复杂的滤镜时 vf=@标签1:滤镜1=子参数1:子参数2:子参数3
,移除它只需要 vf-del=@标签1
即可。
1.1.mpv.conf#
在主设置文件中使用时通常是为了伴随mpv启动时自动应用某些滤镜,例如:
vf=vflip,hflip # 垂直翻转 → 水平翻转
如果你的滤镜链比较复杂,推荐拆开写(带append后缀的选项不会相互覆盖):
vf=vflip
vf-append=hflip
或者:
vf-append=vflip
vf-append=hflip
可能有面对不同的分辨率进行自动处理的需要,可以在profile中操作,此处只简单举例,实际应用时自行举一反三:
[4k_fast]
profile-cond=height>2000 and width>3000
profile-restore=copy
vf-clr
1.2.input.conf & 控制台#
滤镜在快捷键与控制台中有独特的语法,简单讲就是参考上方的表格中的后缀,但移除连接符 -
且 vf
提前,示例:
a vf set vflip,hflip
s vf append vflip
d vf add vflip,hflip
f vf pre vflip,hflip
g vf clr ""
h vf remove vflip
j vf toggle vflip
🔺 根据input语法中的“操作属性”的用法, vf set vflip,hflip
亦等效 set vf vflip,hflip
vf clr ""
的作用也可通过 set vf ""
来达成。
2.滤镜分类#
mpv所能使用的滤镜大体分为两类 ——
mpv自己实现的滤镜:
format & sub & vapoursynth & vavpp & vdpaupp & d3d11vpp & fingerprint & gpu
来自ffmpeg的滤镜:
lavfi
根据版本、平台和编译选项的不同,你所能实际使用滤镜类型和个数并不恒定,可通过如下方式查看:
定位到 mpv.com 所在目录,打开 powershell 执行以下命令查看视频滤镜的综合信息 ——
./mpv --vf=help
🔺 Available libavfilter filters:
此行往下列出的即“来自ffmpeg的滤镜”
ffmpeg滤镜有自己的 文档 ,它们并不在mpv的官方手册中记录
除开手册外,还可以通过如下指令查看滤镜的子参数
./mpv --vf=滤镜名=help
2.1.原生滤镜#
即“mpv自己实现的滤镜”
使用时注意它们的滤镜名(一般情况下)需要写完整(不能跳过中间的项),示例:
vf=format=fmt=brga # 转换为brga格式输出
其中 format=fmt
为完整滤镜名( fmt
不可省略),而 brga
为参数值。
2.2.非原生滤镜#
即“来自ffmpeg的滤镜”
使用时可接受多种语法,因为原始语法较为复杂易于出错,参考如下示例(以下写法皆正确):
vf=lavfi=[fps=60]
vf=lavfi="fps=60"
vf=lavfi=graph="fps=60"
vf=fps=60
出于简化原因,因此通常使用简化语法 vf=fps=60
;
通过查阅 文档 可知该滤镜有如下子参数 fps
start_time
round
eof_action
由此体现了非原生滤镜的另外的语法特性是可以进一步精简,即 vf=fps=60
等效 vf=fps=fps=60
我推荐尽可能把子参数名写上,如果不写子参数名,mpv会尝试自动打上标签。
🔺 原生与非原生滤镜中可能存在重名的条目,例如通常当使用 vf=format=...
时首选mpv滤镜,最简的解决方案是显式指定为ffmpeg滤镜,即 --vf=lavfi-format=...
🔺 性能提速小技巧:
当只使用多个非原生滤镜时,建议合并进一个filtergraph处理,示例 优先用 vf="lavfi=[vflip,hflip]"
而不是 vf=vflip,hflip
2.2.1.字符串处理#
非原生滤镜中的很多滤镜支持引入外部文件参与处理,例如 lut3d
文档
假设已下载 xxx.cube
文件到路径 D:/luts test/
🔺 非原生滤镜不支持诸如 ~~/
之类的相对路径
如果只在 mpv.conf 中使用,十分简单
vf=lut3d=file="D:/luts test/pinkgirl.cube":interp=trilinear
但是若用在 input.conf 中,存在语法上的暗病,需要处理其中的特殊字符
Ctrl+l vf toggle "lut3d=file=\"D:/luts test/pinkgirl.cube\":interp=trilinear"
或者简单粗暴的使用 自定义引用
Ctrl+l vf toggle ``lut3d=file="D:/luts test/pinkgirl.cube":interp=trilinear``