# 视频旋转

转四分之一圈、半圈，或者往另一边转。使用文件头旋转时，每一帧画面保持原样。

> 在浏览器里旋转视频。使用文件头旋转时，每一帧画面原样复制；为老播放器把旋转烧进画面时，画面会重新编码。AAC 声音原样复制，其他能解码的声音重新编码为 AAC，也可以去掉声音。MP4、MOV、WebM、MKV 进，MP4 出。什么都不上传。

This is an interactive browser tool at https://httcup.github.io/tools/rotate-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、M4V、WebM 或 MKV。浏览器直接从你的硬盘读它，页面会说它是什么，以及它现在是朝哪边显示的。
2. **选方向，看预览。** 往右转四分之一圈、往左转四分之一圈，或者倒过来。第一帧会按你选的方向、用文件将要写进去的同一套算法画出来，所以你看到的就是播放器会做的。只有播放器把片段放横了的时候才勾「烧进画面」；宁愿这段视频没有声音的话，勾上去掉声音。
3. **旋转，然后读那句写着「已核对」的话。** 文件头写好，每一帧复制过去，只要几秒；烧进画面要花一次编码的时间，进度条会说到哪了。然后做好的文件会在这里重新打开，它必须跟原来一样长、按你要的方向显示、并且带着它的声音。它在下载按钮下面从内存里播放，你能看到它是正的。

## The longer version

[如何无损旋转视频](https://httcup.github.io/tools/guides/rotate-a-video/): 手机视频为什么横着播放，文件头九个数字做什么，为什么多数旋转器白白重编码，什么时候该转像素，以及怎样无需上传。

## Also in the box

- [图片转视频](https://httcup.github.io/tools/images-to-video/): 一个文件夹的图片，变成一段视频。
- [视频剪切](https://httcup.github.io/tools/trim-video/): 一边看一边标出要留的段落，最后拿回一个视频。
- [视频裁剪](https://httcup.github.io/tools/crop-video/): 把片子切到只剩要紧的那块。
- [视频倒放](https://httcup.github.io/tools/reverse-video/): 最后一帧排在最前，连声音一起。

## Questions

### 旋转会损失画质吗？

使用文件头旋转时，每一帧画面一个字节不差地复制过去，画质不变。只有把旋转烧进画面才会重新编码画面。AAC 声音原样复制；其他能解码的声音会重新编码为 AAC，除非选择去掉。声音也原样复制时，文件大小几乎不变。

### 为什么在某个播放器里文件还是横的？

因为那个播放器不理显示矩阵。每一部手机、每一个浏览器、每一个现代播放器和剪辑软件都认它；少数老的桌面播放器不认，直接把存着的帧放出来。勾上「把旋转烧进画面」，帧本身会被转过来并重新编码成 H.264，那样每个播放器放出来都一样，代价是丢一代画质。

### 往右转四分之一圈是哪边？

顺时针，就是你把手机往右转的时候画面顶部移动的方向。预览会把第一帧按你选的方向画出来，所以挑那个让它看起来是正的按钮，然后按大的那个。

### 它读哪些文件？

MP4、MOV 和 M4V，里面是什么画面都行，因为写进文件头的旋转不在乎帧是什么。WebM 和 MKV，里面是 H.264 就原样复制帧，其余的烧进画面，因为 MP4 的文件头只能围着 H.264 搭起来。AAC 声音原样复制；Opus、Vorbis、MP3 和 FLAC 重新编码成 AAC；浏览器解不开的声音会点名去掉。结果永远是 MP4。

### 要多久？

普通的旋转只要几秒：文件读一遍拿布局，写的时候再读一遍，一个 GB 走的是你硬盘的速度。烧进画面要花你的机器编码这段视频所需的时间，有硬件编码器的话（大多数笔记本和近年的每一部手机都有）比视频本身还短；没有的话更慢。

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

不会。文件由你自己的浏览器在你自己的硬件上读取、换文件头、重新写出，这一页的 `Content-Security-Policy` 列出了它可以联系的每一个地址，没有一个属于本站。最简单的自证办法是断开网络照样用。对这么大的文件来说，这也是最快的办法：上传比整件活儿还慢。

### 手机上能用吗？

能。使用文件头旋转时，画面不解码，直接原样复制；声音可能需要编码为 AAC。做好的文件会放在内存里直到保存，手机通常可以容纳几百兆的结果。把旋转烧进画面还需要编码画面，手机的硬件编码器可以加速。

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

文件是分块从硬盘读的，所以进来的文件比内存还大也没问题；做好的文件会一直放在内存里直到你下载，而且这里写出的 MP4 不能超过 4 GB。它是免费的，不注册、不登录，也没有试用期。本站带广告，那是养活它的东西；广告拿不到任何关于你视频的内容。

### 断网能用吗？

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

## How the privacy claim is verifiable

- **画面的旋转是文件头里的九个数字。** 手机把画面按传感器看到的样子存下，再把旋转写进轨道的显示矩阵，播放器会在屏幕上应用它。使用文件头旋转时，这一页写下你选的矩阵，每一帧画面原样复制，不重新编码。AAC 声音原样复制；其他能解码的声音会重新编码为 AAC，除非你选择去掉声音。声音也原样复制时，文件大小几乎不变。
- **上传才是最慢的那一步，而这一步在这里不会发生。** 每一个在线旋转工具都要先把整个文件拿到手：一个 GB 沿着你的网络传上去，为的是换一个转过的 GB 传回来，上传花的时间通常比它换来的活儿还长，这还没算谁留着那份文件的问题。它们多半还会重新编码一遍，为一件只需要九个数字的事丢掉一代画质。这一页用从这个地址发来的代码读文件，在内存里写出新文件，所以唯一在动的字节，是从你的硬盘到内存再回去。这一页的 `Content-Security-Policy` 列出了它可以联系的每一个地址，没有一个属于本站，而且断了网它照样能用。
- **谁认这个文件头，少数不认的怎么办。** 每一部手机、每一个浏览器、每一个现代播放器和剪辑软件都会应用显示矩阵；从 2010 年起手机拍的视频就是这么被正着显示的。少数老的桌面播放器不理它，直接把存着的帧横着放出来。为了它们，也为了那些你没法亲自检查的去处，页面提供把旋转烧进画面：每一帧转好画到画布上，再重新编码成 H.264。这会丢一代画质，也要花一次编码的时间，所以它是第二选择，页面也把它当第二选择来写。
- **结果会重新打开核对一遍。** 一个写错了矩阵、或者矩阵对了尺寸错了的旋转工具，做出来的文件仍然打得开。所以做好的文件会在这里重新打开，用的就是读你拿来那个文件的同一个读取器，它必须跟原来一样长、按你要的方向显示、尺寸也对得上、并且带着说好的声音。它在下载按钮下面从内存里播放，你保存之前就能看到它是正的。
- **它读哪些文件，写出什么。** MP4、MOV 和 M4V，里面是什么画面都行（H.264、HEVC、VP9 或 AV1），因为写进文件头的旋转不在乎帧是什么；WebM 和 MKV，里面是 H.264 就原样复制帧，不是的就烧进画面，因为 MP4 的文件头只能围着 H.264 搭起来。AAC 声音原样复制；Opus、Vorbis、MP3 或 FLAC 重新编码成 AAC；浏览器解不开的声音会点名去掉。结果永远是 MP4，因为那是什么都能播的那一种容器。
- **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/rotate.js`；一帧是怎么不被读取就搬过去的，看 `src/shared/copy-tracks.js`。这几个都够不着网络，旁边负责读和写的部分也一样。
