halfsize / 20 MB
把视频压到刚好 20 MB
邮件附件、报名表、企业门户、Discord、微信,很多东西都卡在 20 MB。 这条命令专门对付它:按目标大小反推码率,自动挑分辨率,然后告诉你画质掉了多少。
$ npx halfsize 视频.mp4 --to 20mb
halfsize 0.1.5
视频.mp4
136 MB 60s 1920x1080 30.00 fps h264
target 20.0 MB
plan H.264 1280x720 2.46 Mbps audio 128 kbps 2-pass
scale 1920x1080 → 1280x720
output 视频.20mb.mp4
measuring quality done in 8s
136 MB → 19.45 MB 小 7.0 倍 比目标小 2.7%
VMAF 88.3 SSIM 0.971 轻微变软
为什么不直接用在线压缩?
在线工具能用,直到你想起视频里有身份证、客户演示或者孩子的班级演出。为了省五分钟,把私人视频传到广告支撑的服务器上,不划算。
halfsize 在你自己电脑上跑 FFmpeg:不上传、免注册、无额度,断网也能用。代价是它是个命令行工具,不是按钮。所以它也带了一个本地网页界面:
$ npx halfsize --web
halfsize web UI on http://127.0.0.1:4174
界面由本机提供,文件不会被上传。
「刚好 20 MB」到底有多准
视频码率是变化的,编码器不可能在开始前承诺精确字节数。halfsize 会根据目标算出码率预算,扣掉音频和容器开销,编完再检查。实际会落在上限下方 1%–3%,这正是你要的:19.45 MB 到处都能过,20.01 MB 不行。
如果某个网站仍然拒收,就多留一点余量:
$ npx halfsize 视频.mp4 --to 19mb
哪些地方卡 20 MB
| 场景 | 上限 | 命令 |
|---|---|---|
| 微信聊天视频 | 20 MB | --for wechat |
| Discord 免费用户 | 20 MB | --for discord |
| WhatsApp 媒体 | 16 MB | --for whatsapp |
| 多数邮箱附件 | 20–25 MB | --to 20mb |
| 各类上传表单 | 20 MB | --to 20mb |
上限会变。拿不准时,按表单写的数字再留一点余量。
20 MB 的画质够用吗
一分钟 1080p 视频,20 MB 扣掉音频后视频大约 2.4 Mbps。这个码率给 720p 够用,给 1080p 偏紧,所以工具会主动降分辨率。实测:
| 目标 | 输出 | 分辨率 | VMAF | 结论 |
|---|---|---|---|---|
| 20 MB | 19.45 MB | 1280×720 | 88.3 | 轻微变软 |
| 16 MB | 15.59 MB | 960×540 | 84.8 | 轻微变软 |
| 10 MB | 9.77 MB | 960×540 | 82.9 | 轻微变软 |
VMAF 90 以上看起来一样,80–90 轻微变软,70–80 能看出损失。
视频越长,分辨率只能越低。10 分钟压到 20 MB,视频码率只有 0.25 Mbps,工具会降到 360p 甚至 240p,并如实报告「能看出损失」。这不是 bug,是算术。在意画质就剪短。
常用参数
--to 20mb:目标大小,支持mb、mib或直接写字节。--for wechat:平台快捷方式,自动套用当前上限。--codec h265:同尺寸大约多 30% 画质,但兼容性差一些。--no-downscale:强行保留原分辨率。--crf 23:不在意大小时的质量优先模式。--json:输出机器可读结果,方便脚本调用。--dry-run:只打印方案,不编码。
批量处理
$ npx halfsize 片头.mp4 演示.mp4 片尾.mp4 --to 20mb
片头.mp4 → 片头.20mb.mp4 19.4 MB VMAF 88.1
演示.mp4 → 演示.20mb.mp4 19.6 MB VMAF 86.7
片尾.mp4 → 片尾.20mb.mp4 19.2 MB VMAF 90.2
常见问题
免费吗?
免费。MIT 协议,没有付费版、水印或账号。
会上传文件吗?
不会。全部在本地完成,只有安装时会下载一次静态 FFmpeg。
为什么输出比 20 MB 小?
容器开销和码率波动很难精确预测,所以留了安全余量。想更贴近上限可以用 --to 20.4mb。
画质还能看吗?
工具会给出 VMAF、SSIM 和人话结论。一分钟视频压到 20 MB 的实测是 VMAF 88.3,属于轻微变软。
能压 1080p 吗?
加 --no-downscale 可以,但同码率下通常不如 720p。先用 --dry-run 看看方案。
不装 Node.js 能用吗?
命令行版通过 npm 分发,需要 Node.js 18+;FFmpeg 会自动处理。