# 视频截帧 — 把视频里的某一帧存成图片

任意位置，一张原画质静帧。

> 把 MP4、MOV 或 WebM 的任意一帧存成原尺寸 PNG 或 JPEG。可以一帧一帧地挪，也可以每隔几秒截一张。全在浏览器里跑，什么都不上传。

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

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

帧的查找、解码和绘制，都由你自己的浏览器在你自己的硬件上完成。这里没有任何东西能取或能发，因为这个工具压根就没有网络功能。就算有路可走，页面的另一端也根本没有服务器可以接收视频。

- ✗ 不上传
- ✗ 不注册
- ✗ 无水印
- ✓ 原始分辨率
- ✓ 断网可用

## 从视频里截一帧的步骤

1. **选一个视频。** 把 MP4、MOV、M4V 或 WebM 拖到选择框里，或者自己找出来。浏览器直接从磁盘上读，这期间没有任何东西发往别处。
2. **找到那个瞬间。** 播放然后在想要的地方停下，或者拖动滑块。MP4 的滑块一格就是一帧，所以你看到的和你存下的之间不存在取整。方向键一次挪一帧，按住 `Shift` 一次挪十帧。
3. **挑一个格式。** PNG 会把解码出来的帧原样存下，这就是这里说的“原画质”。JPEG 和 WebP 更小，但会在视频自身的压缩之上再压一遍，用来预览没问题，用在之后还要再编辑的图上就不合适。
4. **截一张，或者截一串。** 单张会直接进你的下载。“每 N 秒”会把片子走一遍，在每个刻度取一张，做一览图和缩略图时很好用，而且它们会打包成一个 ZIP，而不是弹一百次保存提示。

## 说得更细的版本

[怎么把视频里的一帧存成图片](https://abox.tools/zh/guides/grab-a-frame-from-a-video/): 按原分辨率从片子里取一张静帧：为什么暂停后的截屏不是同一张图、该存成什么格式，以及怎么正好停在你想要的那一帧。

## 工具箱里还有

- [GIF 转 MP4](https://abox.tools/zh/gif-to-mp4/): 每一帧都带着 GIF 给它的延时，变成 MP4 里的 H.264。在你的机器上转，文件从不上传。
- [视频转 GIF](https://abox.tools/zh/video-to-gif/): 挑好段落、尺寸和帧率。
- [GIF 制作](https://abox.tools/zh/gif-maker/): 把一组图片变成一段动画。
- [GIF 拆帧](https://abox.tools/zh/split-gif/): 每一帧都单独存成一张 PNG。

## 常见问题

### 我的视频会被传到哪里去吗？

不会。它由你自己的浏览器在你自己的硬件上读取和解码。这个工具没有服务端，页面的 `Content-Security-Policy` 里写着它允许联系的每一个地址，没有一个属于本站。你要是宁可自己查也不愿听我们说，拔掉网线，照样截一帧试试。

### “原画质”到底是什么意思？

两件事。一是这张图按视频本身的分辨率保存，而不是按页面上预览的大小，4K 的片子给的就是 ⁦3840 x 2160⁩ 的图。二是选了 PNG 的话，这一帧就是从解码器出来时的样子，文件里装的正是视频里装的画面，上面没有再压一层。对着播放器窗口截屏两样都得不到：尺寸是窗口的尺寸，而且是播放器缩放并做完色彩管理之后的画面。

### 哪些视频格式可以截帧？

MP4、M4V 和 MOV 直接读，里面装什么都行：H.264、HEVC、AV1 或 VP9，只要你的浏览器能解那个编码。这是精确路径，工具能点名到具体某一帧。其他浏览器能播的东西，最典型的是 WebM，则靠把播放器挪过去、再把它显示的内容画下来，一样能存出原尺寸的图，但落到的是播放器选的那一帧，而不是你要的那一帧。浏览器既读不了也播不了的文件，实际上就是 AVI、WMV、FLV 和大多数 MKV，会带一句说明直接拒掉。

### 能一帧一帧地挪吗？

MP4 可以，而且是精确的：工具读的是文件自己的帧列表，所以方向键是在真正存在的那些画面之间移动，哪怕片子的帧率忽高忽低也一样，而按三十分之一秒固定步进就会越走越偏。走播放路径时没有这份列表，一次操作大约挪一帧，页面也会明说。

### 我竖着拍的手机视频在这儿为什么是正的？

因为旋转是特意应用上去的。手机是横着拍的，然后把“转四分之一圈”写进文件里，而不是真的把像素转过来，所以解码器交出来的帧是躺着的，每个播放器都会在送到你屏幕的路上把它扶正。跳过这一步的工具，会存下一张时刻没错、但躺着的图。这个工具会从轨道里读出旋转值，在画任何东西之前先应用。

### 视频的大小或时长有上限吗？

工具里没有写死的上限，文件也不会一次性读进内存，而是几兆几兆地走过去，所以长片子和短片子开得一样快。你截下的图在下载之前留在页面里，所以真正的天花板是几百张 4K PNG，而不是视频本身。

### 截下来的图之后能缩放或裁剪吗？

这里不行，隔壁可以。这个工具只是把帧原样存下来；改尺寸或改形状是另一件事，里面有自己的取舍，[图片尺寸调整](https://abox.tools/zh/resize-image/)两件都能做，同样什么都不上传。想在不改画面的前提下把文件变小，用[图片压缩](https://abox.tools/zh/compress-image/)。

### 它免费吗，需要注册吗？

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

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

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里不会去取任何东西。** 这个工具压根就没有网络功能：没有地址可填，没有东西要下载，第一次用也不会拉什么引擎。碰到你视频的每一个字节，都是页面加载时从这个源来的。
- **解码在本地完成。** 帧要么走你自己浏览器里的 WebCodecs，要么走本来就会给你放这个片子的那套播放引擎。画面画在这台机器的 canvas 上，然后直接交给下载。
- **文件是几兆几兆读的。** 视频是这里唯一一种不能保证塞得进内存的文件，所以从来不整个加载。读取器只取你要的那一帧前后的一小段窗口，这也是两个 G 的片子和小片子开得一样快的原因。
- **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/shared/mp4-reader.js` 是在 MP4 里找出各帧的读取器，`src/frames.js` 是负责把你要的那一帧解出来的部分。两者都没有引入任何能发出请求的东西。
