halfsize / Windows
Windows 11 没有「压缩到 20 MB」
在资源管理器里几乎什么都能右键,唯独没有「把这个视频变成 20 MB」。系统自带的工具都是按画质档位 压的,而「指定体积」是另一个问题;其中还有一个压根不是压缩。
Windows 11 到底给了什么
| 工具 | 对视频做了什么 | 能指定大小吗 |
|---|---|---|
| 资源管理器 → 压缩为 ZIP | 什么也没做:MP4 本来就已经压缩过 | 不能 |
| 照片 → 编辑 / 裁剪 | 裁剪后另存,码率不变 | 不能 |
| Clipchamp 导出 | 按 480p / 720p / 1080p 预设重编码 | 不能 |
| Office「压缩媒体」 | 只影响插进文档里的片子,而且是画质档位 | 不能 |
| FFmpeg(winget 安装) | 按算出来的码率做两遍编码 | 能 |
| halfsize(封装 FFmpeg) | 同上,另外给你实测画质分数 | 能 |
ZIP 那一行值得单独说清楚,因为它是绝大多数人第一个尝试的东西:视频已经是熵编码过的数据, 通用压缩几乎找不到可删的冗余。40 MB 的片子打成 zip 还是 40 MB,只是多花了一秒。
Clipchamp 是真会压缩,但它转的旋钮是分辨率,不是字节预算。一段 20 分钟的 1080p 录屏导出 720p, 出来可能是 300 MB 也可能是 90 MB,取决于画面内容;你没法要求「就给我 20 MB」。
Windows 不会替你算的那道题
体积上限会换算成码率:MB × 8000 ÷ 秒数,再减掉音频和封装开销。按 20 MB、
128 kbps 音轨、2% 开销算:
| 片长 | 20 MB 留给视频的码率 | 够用来做什么 |
|---|---|---|
| 15 秒 | 10.3 Mbps | 舒服的 1080p |
| 30 秒 | 5.1 Mbps | 不错的 1080p |
| 1 分钟 | 2.5 Mbps | 720p |
| 2 分钟 | 1.2 Mbps | 720p,或干净的 540p |
| 5 分钟 | 395 kbps | 540p,低运动 |
| 10 分钟 | 133 kbps | 幻灯片区 |
视频码率低于 80 kbps 左右,就没有哪个编码器还能压出「视频」的样子了。这是预算的性质,不是编码器的。
那条命令,在 PowerShell 里
先用 winget 装一次 FFmpeg:
> winget install Gyan.FFmpeg
然后跑两遍。第一遍只分析片子、写日志,不产出视频,所以输出到 NUL——这是 Windows 的空设备,
并且必须带上 -f mp4 FFmpeg 才肯接受。下面是 60 秒的片子压到 20 MB,所以视频码率取 2480 kbps:
> ffmpeg -y -i "假期.mp4" -c:v libx264 -preset medium -b:v 2480k -pass 1 -passlogfile ffpass -an -f mp4 NUL
> ffmpeg -i "假期.mp4" -c:v libx264 -preset medium -b:v 2480k -pass 2 -passlogfile ffpass -c:a aac -b:a 128k -movflags +faststart "假期.20mb.mp4"
两个容易踩的点:路径有空格一定要加引号(PowerShell 会正常传过去),并且第二遍必须读和第一遍同一个日志名。
第二点,第一遍要加 -an:音频在两遍之间没有变化,编两遍纯属浪费时间。
这条命令的前提是片长足够短,2.48 Mbps 还能看。十分钟的片子同样 20 MB 就是 133 kbps, 输出也会诚实地长成那个样子——命令照样能跑,只是它变不出比特来。
为什么结果还是会差一点
两遍 ABR 控制的是整段的平均值。有激烈场景的片子会在那里超、在别处省,总量只是接近,不是精确; 封装还要再加一点。实务上的答案是瞄低 3–5%,下面这个工具就是这么做的。
一条命令的版本
> npx halfsize 假期.mp4 --to 20mb --dry-run
target 20.0 MB
plan H.264 1280x720 2.46 Mbps audio 128 kbps 2-pass
scale 1920x1080 → 1280x720
estimate 19.3 MB
> npx halfsize 假期.mp4 --to 20mb
136 MB → 19.45 MB 小 7 倍 比目标小 2.7%
VMAF 88.3 轻微变软
--dry-run 才是最值得学走的部分,哪怕你继续手写 FFmpeg:它在编码之前的十秒钟里,
就把码率和「这个预算能撑住哪一档分辨率」打印出来。同样 20 MB,选 720p 还是硬撑 1080p,
就是清晰和发软的区别。
不需要全局安装,npx 第一次跑完就会缓存。想长期用就 npm install -g halfsize。
别叠压缩器。如果这段视频接下来还要发微信或 WhatsApp,就一次压到那个软件能接受的大小, 不要压两遍。第二遍才是你看得见的那一遍。
常见问题
打成 zip 会变小吗?
不会。MP4 已经是压缩数据,zip 只能省不到 1%。压缩成 ZIP 是给文档用的。
系统自带功能能指定大小吗?
不能。照片只能裁剪,Clipchamp 只能选分辨率预设,Office 只压文档里的内嵌媒体。要精确到字节只能两遍编码,也就是 FFmpeg 或它的封装。
为什么还是超过目标?
两遍 ABR 控的是平均值,激烈画面会超。留 3–5% 余量,或者用会复测、超标重编一次的工具。
NUL 还是 /dev/null?
Windows 的空设备是 NUL,前面要加 -f mp4;macOS / Linux 用 -f mp4 /dev/null。
Windows 10 能用吗?
能。FFmpeg 命令和 halfsize 完全一样,只有照片和 Clipchamp 那两行不同。