halfsize / 发完变糊
发出去就糊,是因为它被压了两遍
你只压了一次,也检查过,看着还行。发出去之后,对面收到的却是软的。因为发送软件并没有把你的文件 原样递过去,它先解码,再按自己的存储预算编码了一个新文件。 每个聊天软件都是一个你没有配置过的第二台压缩器。
谁会重压,谁会把字节原样交出去
| 发到哪里 | 软件做了什么 | 怎么保住原样 |
|---|---|---|
| WhatsApp,当媒体发 | 重编码,通常 720p,码率自己定 | 改成文档发送 |
| Telegram,当视频发 | 重编码进它的流媒体档位 | 改成文件发送,或「不压缩发送」 |
| 微信聊天视频 | 重编码,分辨率由它决定 | 开原视频,或用文件发送 |
| iMessage | 大视频会被压得很狠 | 没有开关;改用邮件、AirDrop 或文件链接 |
| Discord,没超上传上限 | 原样传输 | 什么都不用做 |
| 邮件附件 | 只做 base64,字节不变 | 什么都不用做 |
| 网盘链接 | 原样存储 | 什么都不用做 |
这张表可以读成一句话:你从哪个渠道发,决定了你压出来的东西能不能活到对面。 Discord 和邮件送的正是你做出来的文件;WhatsApp、Telegram、微信和 iMessage 送的则是 「它们的编码器对你要发的文件的理解」。这就是同一个文件在你自己电脑上挺好、在对方手机上却很差的原因。
为什么第二遍比第一遍更伤
编码器擅长丢掉「人眼本来就不注意」的信息,但这份红利只有一次。第一遍留下的,是刚好卡在可见阈值 之上的纹理、渐变和运动。第二遍没有这份余量可花:它再丢一次同类细节,而这一次,丢掉的部分就看得见了。
这笔账不用实测也成立。假设一段 60 秒的视频你压到了 20 MB,扣掉音频和开销,视频大约 2.4 Mbps。 如果软件按它惯常的 720p 预算、大约 1 Mbps 重压一遍,它只保留了你刚刚认定「最低可接受」的 40% 的比特。你的文件第一次测出来多少分不重要,对方拿到的那一份是要重新打分的。
一条能解决大部分情况的规则:既然软件无论如何都要重压,就别把比特花在它一定会扔掉的地方。 要么压到它的阈值以下让它原样放过,要么用「文件」模式传输字节。
办法一:当文件发
表里每个软件都有一个把视频当成「不透明文件」的模式。代价是对方收到的是一个下载提示,而不是直接 能点的播放器。如果这段视频是要被留下来的——婚礼、看房、给客户的演示——这个交换明显值得。
软件的文件上限依然存在,但那是唯一需要遵守的数字,而且通常比媒体上限高得多。WhatsApp 的文档上限 就远高于 16 MB 的媒体上限,一个 50 MB 的文件可以原样过去,当媒体发则永远发不出去。
办法二:一次压到软件能接受的大小
如果必须当媒体发(要能直接点开播),那就一次压到它真正的预算,并且直接用它会用的分辨率。 软件反正要降到 720p,你却按 1080p 压,等于一半的比特在被看到之前就扔掉了。
$ npx halfsize 假期.mp4 --for whatsapp
target 16.0 MB
plan H.264 960x540 1.94 Mbps audio 128 kbps 2-pass
scale 1920x1080 → 960x540
136 MB → 15.59 MB 小 8.7 倍 比目标小 2.6%
VMAF 84.8 轻微变软
预设用的是各平台公开的免费档上限。一分钟 16 MB 只有 1.94 Mbps,够一个干净的 540p, 不够 720p,所以工具选 540p 而不是发软的 720p。这就是软件会做的同一个取舍,区别只是: 你在发出去之前就能看到画质分数,而不是之后。
怎么判断文件到底有没有被重压
拿你发出去的文件和对方存下来的文件比一下分辨率、码率和时长,一般就够了:
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height,bit_rate -of default=nw=1 发出的.mp4
width=1920
height=1080
bit_rate=8143221
$ ffprobe -v error -select_streams v:0 -show_entries stream=width,height,bit_rate -of default=nw=1 收到的.mp4
width=1280
height=720
bit_rate=1041888
同一个片段,发出去是 1080p / 8 Mbps,收到的是 720p / 1 Mbps。这不是你调参能改的,只有换发送方式能改。
「糊」还有另外两个来源
- 其实是发灰,不是糊。HDR 素材经过丢了传递曲线的工具,看起来会又平又淡。 那是另一个问题,另一种修法。
- 它本来就不锐。便宜的手机镜头、数码变焦、激进降噪,压一遍之后都会表现得像压缩损伤。 压缩会让本来发软的素材软得更快。
常见问题
为什么微信发完就糊了?
聊天视频会重编码,通常降到 720p 并用它自己的码率。你的文件已经压过一次,这是第二遍,去掉的是第一遍特意保留的细节。
用「文件」发就不会被压?
对。文件/文档模式原样传字节,对方下载后播放,软件的文件上限仍然适用。
没超上限为什么也变差了?
上限和编码器是两件事。没超上限照样重压,而且分辨率常常被无条件压到 720p。
iPhone 上一样吗?
iMessage 对大视频压得很狠,而且没有「发原视频」的开关。AirDrop、邮件或文件链接才能保住字节。
收到的文件还能修吗?
不能。再编码只会叠加损失。要原片,下次改用文件发送。