# 视频转 GIF 把视频做成动图

挑好段落、尺寸和帧率。

> 把 MP4、MOV 或 WebM 里的一段做成 GIF 动图。段落、宽度和帧率你来定，读帧和写 GIF 都在你的浏览器里完成。什么都不上传。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/video-to-gif/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的视频**在浏览器里处理**，无须上传处理。

每一帧的读取、缩放、量化和写出，都是你自己的浏览器用你自己的硬件做的。这里没有任何东西能取数据或者发数据，这个工具压根没有联网功能。就算真有，这个页面的另一头也没有服务器能接住一段视频。

- ✗ 不上传
- ✗ 不注册
- ✗ 没有水印
- ✓ 多长都行
- ✓ 断网能用

## 视频怎么做成 GIF

1. **选一段视频。** 把 MP4、MOV、M4V 或者 WebM 拖到下面的方框里，或者点开自己挑。浏览器直接从你的硬盘上读，这期间没有东西发出去。
2. **标出那一段。** 放起来，该开始的地方按 `I`，该结束的地方按 `O`，也可以直接拖条上那两个手柄。GIF 就该是几秒钟的东西。文件是小是大，这个设置说了算，另外两个加起来都没它要紧。
3. **挑宽度和帧率。** 宽 480 像素、每秒 12 帧，GIF 的常见用途基本都够。宽度砍一半，像素少四分之三；每秒十二帧已经读得出是在动，再多的那些帧谁也看不出来，白花钱。
4. **做出来，然后下载。** 帧读进来，整段动画共用一份 256 色的配色板，每一帧只写画面里变了的那一块。做完就在页面上放给你看，那张图跟你下载到的是同一个文件。

## 说得更细的版本

[怎么把视频做成 GIF](https://abox.tools/zh/guides/turn-a-video-into-a-gif/): 该挑哪一段、多宽、每秒几帧，视频做成 GIF 为什么会大出十倍，以及什么时候压根不该用 GIF。

## 工具箱里还有

- [GIF 制作](https://abox.tools/zh/gif-maker/): 把一组图片变成一段动画。
- [GIF 拆帧](https://abox.tools/zh/split-gif/): 每一帧都单独存成一张 PNG。
- [GIF 分析](https://abox.tools/zh/gif-analyzer/): 帧、延时、调色板，以及每个字节的去向。
- [视频压缩](https://abox.tools/zh/compress-video/): 说一个它最多能有多大。剩下的工具来算，做完先量一遍再交给你。

## 常见问题

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

不会。读取、取帧、转换，全由你自己的浏览器在你自己的硬件上完成。这个工具没有服务器那一半，页面的 `Content-Security-Policy` 把它可能联的地址全列了出来，没有一个是本站的。与其听我们说，不如拔掉网线，照做一张试试。

### 能转哪些格式？

MP4、M4V 和 MOV 直接读，里面装的是 H.264、HEVC、AV1 还是 VP9 都行，只要你的浏览器解得了那个编码。其他浏览器能播的格式，最典型的是 WebM，改成把播放器逐个时间点跳过去取帧，慢一些，落在哪一帧上也没那么精确。浏览器既读不了也播不了的文件，实际上就是 AVI、WMV、FLV 和大多数 MKV，会被直接拒收并说明原因，不会干到一半才崩。

### 我的 GIF 怎么这么大？

因为 GIF 是 1987 年的格式，它存的是一张张完整的图，不是运动。一段五秒的片子，做成 GIF 不可能跟它自己那个五秒的 MP4 一样小，视频转出来的 GIF 通常是原视频的十倍。真正决定大小的是三个设置，按要紧程度排：这一段多长、画面多宽、每秒几帧。宽度砍一半，像素就少四分之三，而花钱的正是像素。

### 为什么只有 256 种颜色？

格式就是这么定的：一张 GIF 带一张最多 256 色的颜色表，每个像素存的是表里的编号。这个工具的做法是把你选中那一段里每一帧的颜色都数一遍，再分成 256 组，用的是中位切分法，业界标准做法，所以配色板是贴着你这段片子长出来的，不是一套固定颜色。缺了某个颜色的地方，抖动会把最接近的两种混在一起，让渐变还是渐变，而不是一道道色带。

### 抖动那个设置是干什么的？

拿一点噪点，换掉一大片色带。开着的时候，一片本来会变成四道平色的天空还是渐变，代价是有点细微的纹理，文件也大一点。关掉则画面更平、文件更小，适合屏幕录像、线稿，以及本来就由大片纯色构成的东西。这里用的是有序抖动，不是误差扩散那种，所以没变化的背景在帧之间稳稳当当，不会满屏爬。

### 长度和体积有限制吗？

开始前，页面会估算保留的帧、GIF 输出和临时解码缓冲区，并拒绝超出有限规划预算的方案。浏览器提供的设备内存提示可能降低预算，但它不会测量可用内存，也不能保证标签页始终处于预算内。减小宽度、缩短片段或降低帧率会减少输出处理量，但原视频仍需自己的解码缓冲区。

### 声音能保住吗？

GIF 装不了声音。这个格式压根没有带音频的版本，这也正是后来网上大多改用无声循环视频的主要原因。声音要紧的话，那就别转，留着视频，[视频剪切](https://abox.tools/zh/trim-video/)能从里面剪出一段，而且一帧都不重编。

### 免费吗？要注册吗？

免费，没有账号，不用登录，没有试用期，也没有水印。本站带广告，经费就是这么来的，广告拿不到关于你视频的任何信息。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里没有任何东西会去联网取数据。** 这个工具完全没有联网功能。没有网址可以粘，没有东西要下载，第一次用也不去取什么引擎。碰过你视频的每一个字节，都是页面加载时从本站来的。
- **解码在本地。** 画面帧走的是你自己浏览器里的 WebCodecs，或者走那个本来就负责放这段片子的播放引擎。用的是哪一条，页面顶上写着，因为这会影响帧是怎么挑出来的，而你应该看得见这一点。
- **GIF 是在这儿写出来的，代码你能读。** 配色板、抖动和 LZW 压缩，加起来大约六百行，就在这个工具自己的目录里。没有编码服务，没有运行时去取的库，整套东西里也没有哪个地方能把一张图送出去。
- **Google 加载了什么，又拿不到什么。** 广告脚本和统计脚本来自 Google。关于你视频的信息，一条都没给它们，文件不给，画面帧不给，文件名、大小、时长、你标的那一段，也都不给。读取、取帧、量化、编码的每一行代码都从本站发出，也都摆在仓库里。
- **捐助按钮加载了什么，又拿不到什么。** 页头那个“Buy me a coffee”按钮，由 cdnjs.buymeacoffee.com 的脚本画出来，字体取自 Google Fonts。它就是个链接，仅此而已，不上报访问，也拿不到关于你或者你视频的任何东西。
- **断网照样能用。** 断开网络，这个页面上的一切照常工作。这是最省事的一条证明。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，`src/frames.js` 里是从视频里取帧的那两条路子，`src/quantize.js` 里是配色板，`src/gif.js` 里是文件本身，连 LZW 都在。这几个都没有引入任何能发请求的东西。
