# 视频压缩

说一个它最多能有多大。剩下的工具来算，做完先量一遍再交给你。

> 在浏览器里把视频压到 8、16、25 或任意兆字节以下。说出大小，工具选画面尺寸和码率，编码，再量结果。什么都不上传，声音原样复制过去。

This is an interactive browser tool at https://httcup.github.io/tools/compress-video/. Files are processed on the device running that browser. Any deliberate sharing or optional network feature is described on the page. What follows is its written explanation; open the address to use it.

## Your 视频 are **processed in your browser**. No processing upload.

你选的那段视频，解码、缩小、重新编码、写回，全都在这台机器的内存里完成，用的是你自己浏览器里的编解码器，和从这个地址发来的代码。这里根本没有能做上传的东西，这一页的另一头也没有服务器可以接收。一个 GB 的文件不会为了变小而先跑一趟上传。

- ✗ 不上传
- ✗ 不注册
- ✓ 断网可用
- ✓ 开源
- ✓ 文件留在你的设备上

## 怎么把视频压到一个发得出去的大小

1. **选那段视频。** 一次一段，MP4 或者 MOV。浏览器直接从你的硬盘上把它读进来，页面会说它是什么：多长、多大、画面尺寸多少、每秒花多少。
2. **说它最多能有多大。** 打一个兆字节数，或者按下别人给你的那个上限，8、16、25、50、100，或者现在这个文件的一半、四分之一。下面那一行会说这个数字能买到什么：视频的时长和声音给画面留下的尺寸和码率，以及结果大概会出来多大。要是你宁愿把整个数字都给画面，就把声音去掉。
3. **想自己定画面尺寸也可以。** 数字会自己选一级阶梯。你更清楚的时候就自己选，一段必须在 1080p 下还能看清字的录屏、一段只会在手机上看的视频，码率就摊在你选的那一级上。阶梯是上限：画面从不会被放得比进来时更大。
4. **压缩，然后读那句写着「已量过」的话。** 画面一帧一帧地解码、缩小、重新编码，进度条说它到了哪里。接着做好的文件会拿去对着数字量一遍，再在这里重新打开核对时长；要是超了，就再紧一点编码一次，页面会说。结果在下载按钮下面从内存里播放，你能亲眼看到它还好好的。

## The longer version

[如何把视频压到可以发送的大小](https://httcup.github.io/tools/guides/compress-a-video/): 大小上限让视频付出什么，容量花在哪里，为什么先降低尺寸，以及怎样在浏览器中少损失、无需上传地压缩。

## Also in the box

- [MP4 转换](https://httcup.github.io/tools/convert-to-mp4/): 不管从录屏、压制还是相机里出来的是什么，都变成 MP4 里的 H.264 和 AAC。能复制的原样复制，非改不可的才重新编码。
- [视频旋转](https://httcup.github.io/tools/rotate-video/): 转四分之一圈、半圈，或者往另一边转。使用文件头旋转时，每一帧画面保持原样。
- [图片转视频](https://httcup.github.io/tools/images-to-video/): 一个文件夹的图片，变成一段视频。
- [视频剪切](https://httcup.github.io/tools/trim-video/): 一边看一边标出要留的段落，最后拿回一个视频。

## Questions

### 视频能压到多小？

压到你打的那个数字那么小，直到什么都看不清的那个点为止，页面会告诉你那个点在哪。声音原样复制，所以它花多少就是多少（普通立体声大约每分钟一兆），画面在最小的尺寸下也需要每秒几百 kbit 才勉强是一幅画面。把声音去掉，它那份就归画面，对一段上限很紧的短视频来说，这常常是能看和糊成一团之间的差别。

### 为什么画面尺寸变了？

因为码率只有相对于它要画的像素数才有意义。每秒两兆比特在 720p 下很宽裕，在 4K 下就是一团泥，所以数字定下码率之后，画面会沿着阶梯往下走，直到每一帧分到的比特足够让它像一幅画面。一幅小而清楚的画面胜过一幅大而糊的，每一个接收上传的服务都在悄悄这么干。这里是在开始之前就说出来，你也可以自己选哪一级。

### 画质会变差吗？

重新编码画面可能丢失细节或产生压缩瑕疵。码率、画面尺寸、源文件和场景复杂程度都会影响可见变化；文件大小上限不能决定精确的画质损失量。音频保持原样复制。请播放结果，比较重要的文字和动作，并保留原本。

### 它写出来的是什么格式？

输出包含 H.264 视频和原始音频轨道副本的 MP4。MP4 中的 H.264 支持广泛，但接收端还必须支持所复制的音频编码和视频配置。请在目标应用中测试成品。本工具不输出 WebM、HEVC 或 AV1。

### 它读哪些文件？

MP4 和 MOV，也就是手机、相机和录屏软件写出来的那种，里面装着 H.264、HEVC、VP9 或者 AV1 都行，只要你的浏览器解得开。iPhone 的 HEVC 视频在有 HEVC 许可的机器上都打得开，大多数机器都有。WebM、MKV 和 AVI 这里还不读；碰到的时候页面会明说，而不是含糊地失败。

### 要多久？

取决于你的机器编码这段视频要多久。有硬件编码器的话，大多数笔记本和最近的每一部手机都有，它比视频本身的时长还快；一分钟的 1080p 通常不到一分钟。没有的话就慢一些，一段很长的 4K 视频不管怎样都要等一阵。进度条说它到了哪一帧，取消立刻停下，什么都不写。

### 为什么编了两遍？

因为编码器落在它被要求的码率附近，而不是正好落在上面，画面很忙的视频可能落在上方。文件会按比数字略低一点去要，然后量；要是量出来还是超了，就按超了多少重新算码率，再编码一遍。两遍总是够的，用了两遍的时候页面会说。

### 我的视频会被上传到什么地方吗？

不会。视频是你自己的浏览器在你自己的硬件上读取、解码、编码、写出的，页面的 `Content-Security-Policy` 列出了它可以联系的每一个地址，其中没有一个属于本站。最简单的验证办法，是把网线拔掉，照样用这一页。对这么大的文件来说，这也是最快的办法：上传通常比编码还久。

### 手机上能用吗？

浏览器能编码视频的手机上能用，而且手机自带的硬件编码器很快。手机缺的是内存：做好的文件会一直放在内存里直到你保存它，所以一段很长的视频可能超出手机能装下的量。先用[视频剪辑](https://httcup.github.io/trim-video/)剪短，或者在笔记本上压。

### 有大小限制吗？要钱吗？

工具里没有写死任何限制。视频是分块从硬盘读的，所以进来的文件比内存还大也没问题；限制在做好的文件，它会一直放在内存里直到你下载，几百兆的结果一台笔记本吃得下。它是免费的，不注册、不登录，也没有试用期。本站带广告，那是养活它的东西；广告拿不到任何关于你视频的内容。

### 断网能用吗？

能。把页面加载一次，然后断开网络，它照样能用。这也是证明什么都没被上传的最简单的办法：一个把你的视频发出去压缩的工具，你一拔网线它就停了。

## How the privacy claim is verifiable

- **上传才是最慢的那一步，而这一步在这里不会发生。** 视频是大多数人这辈子试着发出去的最大的文件，这正是它发不出去的原因。每一个在线压缩工具都要先把整个文件收过去，900 MB 沿着你的网络传上去，才能拿回 25 MB，而那次上传通常比它换来的编码本身还要久，这还没算上谁留着这个文件的问题。这一页用你浏览器里本来就有的编解码器，在你自己的机器上编码，唯一移动的字节是从你的硬盘到内存再回来。页面的 `Content-Security-Policy` 列出了这一页可以联系的每一个地址，其中没有一个属于本站，把网络断掉它照样能用。
- **它从那个数字出发，因为那个数字才是重点。** 聊天软件允许 8 MB 或者 25 MB；邮件允许 25 MB；表单允许它写着的那个数。你要的是文件压到那个数以下，并且在数字允许的范围内尽量少丢东西。所以页面先问数字，再算剩下的：声音原样复制，容器占一点，剩下的摊到视频的时长上，就是画面可以花的码率。码率只有相对于它要画的像素数才有意义，所以画面会沿着一架大家熟悉的尺寸阶梯往下走，直到每一帧分到的比特足够让它看起来像一幅画面，并且从不往上走。这些页面在开始之前全都会说，画面尺寸你也可以自己定。
- **压缩过的视频是重新编码过的视频，页面会这么说。** 压缩在本地解码并重新编码画面，原始音频样本则原样复制。输出为包含 H.264 视频的 MP4，支持广泛，但接收端还须支持所复制的音频编码和视频配置。发送前请测试成品。
- **结果会量一遍，超了就再紧一次。** 编码器落在码率附近，而不是正好落在上面，所以文件会按比数字略低一点去要，然后量。要是量出来还是超了，就按超了多少重新算码率，把视频再编码一遍；两遍总是够的，用了两遍的时候页面会说。接着做好的文件会在这里重新打开，时长必须跟原来一样：一个丢掉最后一秒、或者丢掉声音的压缩工具，做出来的文件也一样更小，只有把结果读回来才分得出区别。
- **它在你机器上的代价，如实说。** 编码要花多久，取决于你的机器。有硬件编码器的话，最近十年的大多数笔记本和每一部手机都有，它比视频本身的时长还快；没有的话就慢一些，一段很长的 4K 视频不管怎样都要等一阵。整个文件是分块从硬盘读的，所以比内存还大的视频没问题，但做好的文件会一直放在内存里直到你下载它，笔记本的上限就在这里。取消随时有效。
- **它读哪些文件，不读哪些。** MP4 和 MOV，也就是手机、相机和录屏软件写出来的那种，里面装着 H.264、HEVC、VP9 或者 AV1 都行，只要你的浏览器解得开。iPhone 的 HEVC 视频在有 HEVC 许可的机器上都打得开，大多数机器都有。WebM、MKV 和 AVI 这里还不读，页面会明说，而不是含糊地失败。
- **Google 加载了什么，又没拿到什么。** 广告和统计脚本来自 Google。这两个都没有拿到关于你视频的任何东西：不是文件，不是一帧，不是文件名、大小、时长，也不是你要求的数字。每一行读取、编码或者写出视频的代码都由这个源站发出，并且列在代码仓库里。
- **打赏按钮加载了什么，又没拿到什么。** 页眉上那个「Buy me a coffee」按钮，是由 cdnjs.buymeacoffee.com 的一段脚本画出来的，字体取自 Google Fonts。它就是一个链接，仅此而已：它不上报访问，也拿不到任何关于你或者你视频的东西。你不点它就什么都不会发生，而点下去要去的是别人的网站。
- **断网也能用。** 把网络断掉，这一页上的所有功能照常。这是最简单的一个证明：一个把你的视频发出去压缩的工具，这时候就停了。

**Check it yourself.** None of the above has to be taken on trust. This page is generated from the templates and config in the repository by a build script you can read and run yourself, and the result is committed to the `dist` branch — so you can diff what is served against what a build of the sources produces: https://github.com/httcup/tools

The files worth reading first are `config/site.toml` for the Content-Security-Policy，一个数字是怎么变成画面尺寸和码率的，看 `src/plan.js`；解码、缩小、编码，以及绕在它们外面原样复制的声音，看 `src/encode.js`。这几个都够不着网络，旁边负责读和写的部分也一样。
