halfsize

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。这不是你调参能改的,只有换发送方式能改。

「糊」还有另外两个来源

常见问题

为什么微信发完就糊了?

聊天视频会重编码,通常降到 720p 并用它自己的码率。你的文件已经压过一次,这是第二遍,去掉的是第一遍特意保留的细节。

用「文件」发就不会被压?

对。文件/文档模式原样传字节,对方下载后播放,软件的文件上限仍然适用。

没超上限为什么也变差了?

上限和编码器是两件事。没超上限照样重压,而且分辨率常常被无条件压到 720p。

iPhone 上一样吗?

iMessage 对大视频压得很狠,而且没有「发原视频」的开关。AirDrop、邮件或文件链接才能保住字节。

收到的文件还能修吗?

不能。再编码只会叠加损失。要原片,下次改用文件发送。

相关