mpv 0.41.0 是命令行驱动的视频播放器,Windows 压缩包 77205127 字节,解开只有 6 个文件共 287539608 字节,主程序 mpv.exe 57294336 字节。

它要解决的是:图形播放器把参数藏在设置面板里,而你要的是「按这个比例铺满、用这个缩放算法、只输出这一路音轨」。这 3 件事在 mpv 里都是一行参数,写进配置文件就永久生效。

这次量了三件事:包里 6 个文件各占多少、窗口多久出来、以及拿掉显示和音频之后纯解码能跑到多少倍速。

6 个文件,287539608 字节

官方 release 的 Windows 包是 77205127 字节,解开只有 6 个文件。压缩比 3.7,因为最大的那个文件是调试符号,压缩率极高。

文件字节说明
mpv.pdb229097472调试符号,运行不需要
mpv.exe57294336主程序
vulkan-1.dll1139712Vulkan 加载器
mpv.com7680控制台包装,用来接管道
mpv-register.bat202注册文件关联
mpv-unregister.bat206撤销关联
压缩包77205127压缩比 3.7
删掉 pdb 后584321366 个文件少一个
pdb 占比79.7%229097472 / 287539608

229097472 字节的 pdb 占 79.7%

调试符号占了整个包的近八成,删掉之后剩下 58432136 字节,程序照常运行。它只在你要用调试器看崩溃栈时才需要,日常播放留着纯属浪费空间。

mpv.exe 和 mpv.com 是同一个程序的两种入口

mpv.exe 走图形子系统,双击不弹控制台;mpv.com 7680 字节,走控制台子系统,能把日志打到标准输出。要看解码细节就用后者。

窗口 513 毫秒

从启动到窗口可见用了 513 毫秒,其中大部分是加载 57294336 字节的主程序和初始化解码器。

指标值
首帧513 毫秒
主程序57294336 字节
解压后目录287539608 字节

513 毫秒里没有解码时间

窗口先出来,第一帧画面随后才贴上。测的 1 个指标是窗口创建,不是首个关键帧解码完成的时刻,后者取决于文件本身和磁盘速度。

不打开文件也能起窗口

加 --force-window=yes 会在没有输入的情况下也建一个空窗口,这个参数是给纯音频场景用的,顺便让「启动要多久」这件事能被单独量出来。

1080p60 能跑到 15.82 倍速

把显示和音频都换成空输出(--vo=null --ao=null),再加 --untimed 解除实时限制,10 秒的 1080p60 内容 0.63 秒解完。

场景10 秒内容耗时CPU 峰值倍速
1080p60 纯软解0.63 秒810.1%15.82x
4K30 纯软解0.85 秒1082.0%11.81x
1080p60 开 hwdec=auto0.63 秒888.2%15.81x
这台机器的逻辑核12 个(6 物理核)
mpv 0.41.0 播放 1080p60 测试视频的窗口,标题栏显示 t1080p60.mp4 - mpv,画面为彩条测试图

810% 意味着占满 8 个核心

CPU 峰值 810.1% 等于 8.1 个逻辑核同时跑满。这台机器是 6 物理核 12 逻辑核,所以软解 1080p60 用掉三分之二算力。4K30 的 1082% 是 10.8 个核,整机只有 12 个逻辑核,余量已经很薄。

15.82 倍速对应约 950 帧每秒

10 秒内容 0.63 秒解完,折算 15.82 倍速;60 帧每秒的视频乘上 15.82 就是每秒约 949 帧的解码吞吐。这个指标只和 CPU 有关,读这个大文件本身不构成瓶颈。

开硬件解码反而更费 CPU

同一个 1080p60 文件加 --hwdec=auto,CPU 峰值 888.2%,比纯软解的 810.1% 还高,倍速没变。

配置CPU 峰值倍速原因
--hwdec=no810.1%15.82x全部在 CPU 上解
--hwdec=auto888.2%15.81x解码搬到 GPU,但要把帧回读到内存
两者差78.1 个百分点0888.2 减 810.1

因为输出是空设备

硬解的价值在于把帧留在显存里直接上屏。测试时用 --vo=null,帧必须回到内存再丢弃,多了一次来回搬运,所以 CPU 反而涨了 78 个百分点。真实播放时这个差别会倒过来。

判断该不该开硬解看场景

4K 以上、或者机器只有 4 个核时,硬解是必需的;1080p 在 6 核以上的机器上,软解的画质和兼容性更稳。

参数就是功能表

没有设置面板,所有能调的东西都是命令行参数,写进 mpv.conf 就变成默认值。

参数作用
--vo=null不输出画面,纯解码
--untimed不等时间戳,尽快解完
--hwdec=no / auto关掉或打开硬件解码
--force-window=yes没有输入也建窗口
--geometry=1280x720指定初始窗口尺寸
测试片源大小209 MB,60 秒 1080p60
实时播放 10 秒 vs 不限速10.46 秒 对 0.63 秒,差 16 倍
> mpv.com --no-config --vo=null --ao=null --untimed --length=10 video.mp4
● Video  --vid=1  (h264 1920x1080 60 fps) [default]
VO: [gpu-next] 1920x1080 yuv420p
Exiting... (End of file)

--no-config 是为了排除干扰

测基准时必须加这个参数,否则你本地的 mpv.conf 里的缩放算法、缓存大小会混进来,两次测量不可比。它让程序只用内置默认值启动。

默认输出是 gpu-next

日志里 VO: [gpu-next] 说明用的是新一代渲染后端,走 Vulkan 或 D3D11。包里那个 vulkan-1.dll 就是给它用的,系统没装 Vulkan 运行时也能跑。

日志里两行够用了

用 mpv.com 跑起来,输出里真正需要看的只有两行:一路是视频轨的编码信息,一路是输出模块选了什么。

● Video  --vid=1  (h264 1920x1080 60 fps) [default]
VO: [gpu-next] 1920x1080 yuv420p
V: 00:00:00 / 00:01:00 (0%)
行含义能看出什么
● Video视频轨编号、编码、分辨率、帧率h264 1920x1080 60 fps,只有 1 路视频
VO输出模块与像素格式选了 gpu-next,格式 yuv420p
V当前时间 / 总时长与百分比总长 00:01:00,即 60 秒

帧率写在这里决定后面 15.82 倍怎么算

日志里 60 fps 这个数字就是倍速换算的基数:15.82 倍速乘 60 帧等于每秒约 949 帧。文件如果不是 60 fps,同一个倍速对应的帧数完全不同。

VO 那行告诉你有没有走 GPU

写 gpu-next 说明渲染走了显卡,写 null 就是纯解码。测吞吐时故意让它显示 null,就是为了把渲染开销从测量里剔掉。

几个真踩过的点

下面三条在这次测试里真实出现,附当时的处理方式。

现象原因处理
双击 exe 没有任何输出mpv.exe 走图形子系统,日志不进控制台改用 mpv.com,或在参数里加 --terminal
脚本里计时的耗时不等于解码耗时默认按时间戳实时播放加 --untimed 才是不限速的真实吞吐
窗口一闪就退出文件路径写错时程序直接结束用 mpv.com 跑一遍看报错,路径里的空格要加引号

不加 --untimed 会白测

第一次测 10 秒内容用了 10.46 秒,看起来像「实时倍率 0.96」,其实是程序在按 60 帧每秒的节奏等时间。加上 --untimed 之后同一段内容 0.63 秒解完,差一个数量级以上。

命令行版本才看得到日志

如果 --length=10 跑完没有任何输出,说明标准输出被丢弃了,此时无法判断解码是否成功;把调用的 mpv.exe 换成 mpv.com 才看得到日志。后者是图形子系统程序,日志不进控制台。

如果把文件路径写错,程序会立即失败退出,控制台只留一行报错;路径里有空格时还要求整段加引号。

什么场景值得上

批量转码前先验证解码能力、或者要把播放器嵌进脚本和自动化流程时,1 个 exe 就能跑完全流程,比带界面的播放器好安排。

场景合适度说明
命令行播放 / 批量处理高参数即功能,能写进脚本
测机器解码能力高--vo=null --untimed 直接出倍速
日常看片中没有播放列表和图形设置,需自己配
需要拖拽字幕、DVD 菜单低这些要靠脚本或外部工具补

它不提供播放列表管理

一次只吃命令行给的文件,队列要靠参数或外部脚本拼。想要「打开文件夹自动连播」得自己写 --playlist 或换别的播放器。

授权与费用

GPL-2.0 或更高,个人和商业环境都不收费。源码在 GitHub 上,主要语言 C,release 里的 Windows 包是官方构建产物,版本号带 git 哈希。