# 视频剪切 在线剪视频

一边看一边标出要留的段落，最后拿回一个视频。

> 标记要保留的片段，在浏览器中保存为一个视频。复制模式保留已编码的帧；精确剪切和录制会重新编码。无需上传，可离线使用。

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

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

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

- ✗ 不上传
- ✗ 不注册
- ✗ 没有水印
- ✓ 想标几段就标几段
- ✓ 符合条件时无损复制
- ✓ 断网能用

## 视频怎么剪

1. **选一段视频。** 把 MP4、MOV、M4V 或者 WebM 拖到下面的方框里。浏览器直接从你的硬盘上读，这期间没有东西发出去。一次拖好几个，它们会按你放进去的顺序接起来。
2. **放起来，把要留的段落标出来。** 该开始的地方按 `I`，该结束的地方按 `O`，想标几次标几次。每一对就是下面表格里的一行，也是时间轴上的一条色带。`U` 撤销刚才那一次，`Space` 播放和暂停，方向键一次跳五秒。那一下不好抓的话，把播放速度放慢。
3. **把标记调准。** 每一行都能单独回放，也能直接打进一个精确时间来改，还能上下调顺序或者删掉。选中那一段的两个端点，也可以在时间轴上直接拖。上面那个合计，就是成品视频将有多长。
4. **是留下它们，还是剪掉它们。** 通常是留下：成品就是你标出来的那些段落，按顺序接在一起。剪掉是另一件大家想干、却很少找得到工具的活，把广告、冷场、废镜头标出来，剩下的部分会自动接上。
5. **剪完就下载。** “一个字节都不动”把画面帧原样复制过去。第一段可以带上前一个关键帧起、不参与播放的画面帧；后续每一段都必须从关键帧开始。“就在这儿下刀”会解码并重新编码每一个保留的画面帧，以保留所选的剪切时间。按下按钮之前，页面会说明将使用哪种方式，以及它的代价。

## 说得更细的版本

[怎么剪视频而不重新编码](https://abox.tools/zh/guides/trim-a-video/): 剪一段片子可以一个字节的画质都不掉。为什么下刀的位置有时候比你标的早，关键帧跟这有什么关系，以及什么时候该认下那次重新编码。

## 工具箱里还有

- [视频裁剪](https://abox.tools/zh/crop-video/): 把片子切到只剩要紧的那块。
- [视频倒放](https://abox.tools/zh/reverse-video/): 最后一帧排在最前，连声音一起。
- [延时视频](https://abox.tools/zh/timelapse-video/): 一小时的素材，二十秒看完。
- [视频截帧](https://abox.tools/zh/grab-frame/): 任意位置，一张原画质静帧。

## 常见问题

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

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

### 同一段视频里能留好几处吗？

这正是它的本行。播放时想按几次 `I` 和 `O` 就按几次，每一对成为一行，成品就是这些行按顺序接起来，别的全没了。网上多数剪切工具只给你一对滑块，问你要留哪一段。掐头去尾还行，可要是你只想把一小时素材看一遍、留下其中值得的六个瞬间，那就完全不够用。

### 剪切会掉画质吗？

“一个字节都不动”保留原始编码的画面帧和声音，不降低质量。保留一段时可以使用；保留多段时，后续每一段都必须从关键帧开始。“就在这儿下刀”会重新编码每一个保留的画面帧，并在条件允许时复制声音。“一边播一边录”会重新编码画面和声音。导出之前，所选方式会说明将进行哪种处理。

### 为什么有一段开始得比我标的早？

复制的第一段可能带上前一个关键帧起的画面帧，因为后面的帧需要它们才能解码。编辑标记要求播放器跳过这些开头的帧；播放器如果忽略它，就可能提前开始。浏览器也可能错误处理内部拼接处不参与播放的帧。因此，只要后续某一段从两个关键帧之间开始，就不能使用复制。遇到这种选择，请选“就在这儿下刀”。它会重新编码每一个保留的画面帧；导出前，页面会说明所用方式，以及开头不参与播放的画面的时长（如果有）。

### 反过来，能把广告剪掉吗？

能。把它们标出来，然后选“剪掉它们”，于是接起来的是你*没*标的那些部分，顺序不变。同一份标记回答的是同一个问题的两面，所以你可以来回切换，看着时长变化，而不用重标一遍。

### 标记能保存下来，回头再接着弄吗？

能。“保存标记”写出一个纯文本文件，一行一段，开始和结束用逗号隔开；“载入标记”把它读回来。两种格式可选，纯秒数和 `HH:MM:SS.mmm`，都遵循同类工具早就在用的那种排布，所以这儿写出来的文件能拿给它们用，它们写出来的文件也能拖到这个页面上。标记是个细致活，谁都不该干第二遍。

### 能剪哪些格式？

MP4、M4V 和 MOV 直接读，里面装的是 H.264、HEVC、AV1 还是 VP9 都行。复制帧这件事根本不涉及解码，所以哪怕你的浏览器压根没有那个编码的解码器，这条路照样走得通。其他浏览器能播的格式，最典型的是 WebM，改成一边播一边录来剪，能用，结果多长就得花多长时间，而且只能留一段。浏览器既读不了也播不了的文件，实际上就是 AVI、WMV、FLV 和大多数 MKV，会被直接拒收并说明原因，不会干到一半才崩。

### 视频的大小和长度有限制吗？

工具里没设上限，而且走复制那条路时，文件基本没被读过：你要留的那些帧只是被指着，不是被装进来的，所以从一个四 GB 的录像里留四分钟，花的代价大约就等于把这四分钟写到硬盘上。精确剪切则一次几兆地走过整个文件。两条路的真正天花板都是成品，它要在内存里拼好你才能下载。

### 声音会保住吗？

两条 MP4 路径上，音频都是逐个采样复制过去、全程不解码的，跟原文件里的字节一模一样，而且每一段的声音跟画面对齐到千分之一秒以内。唯一的例外是把几个声音描述方式不同的视频接在一起，比如采样率不一样，那种情况下不解码就没法把它们塞进同一条音轨，页面会在动手之前说明。走录制那条路，声音是从播放里采下来再编一遍的。两种情况都有个勾选框，可以干脆不要声音。

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

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

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

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这里没有任何东西会去联网取数据。** 这个工具完全没有联网功能。没有网址可以粘，没有东西要下载，第一次用也不去取什么引擎。碰过你视频的每一个字节，都是页面加载时从本站来的。
- **走常规那条路，连解码都没有。** 复制模式将兼容的已编码帧原样移入输出文件。页面保留指向原始字节的文件片段，而不解码它们。精确剪切和录制则不同，会在本地解码并重新编码画面；导出控件会说明这一选择。
- **标记文件是在这个页面里生成的。** 保存标记，就是把屏幕上那些数字写成一个文本文件，直接进你的下载目录。载入标记则在这儿把它读回来。两边都不沾网络，文件里除了时间点什么都没有。
- **复制兼容的音频。** MP4 复制和精确剪切会原样复制兼容的音频样本。连接音频不兼容的片段时，可能在本地解码、重采样并重新编码；录制也会重新编码声音。页面在导出前说明这些情况，不会上传音频。
- **需要解码的地方，也在这儿解。** 精确剪切，以及这个浏览器放不了的文件的预览，走的是你自己机器上的 WebCodecs。那本来就是要放给你看这段视频的同一个解码器，跑在同一个地方。
- **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/segments.js` 里是那些标记和它们存成的文件，`src/shared/mp4-reader.js` 里是在 MP4 里找出帧的那个读取器，`src/ranges.js` 里是把一个标记换算成一串采样的那套算术，`src/copy.js` 里是把这些采样搬进新文件的那个循环。这几个都没有引入任何能发请求的东西。
