# MP4 转换

不管从录屏、压制还是相机里出来的是什么，都变成 MP4 里的 H.264 和 AAC。能复制的原样复制，非改不可的才重新编码。

> 在浏览器里把 WebM、MKV、MOV 或任何 MP4 变成装着 H.264 和 AAC 的 MP4，也就是每一部手机、每一个浏览器和上传表单都收的那种文件。已经是 H.264、AAC 的轨道原样复制；其余的在你的机器上重新编码。什么都不上传。

This is an interactive browser tool at https://httcup.github.io/tools/convert-to-mp4/. 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.

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

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

## 怎么把视频转成 MP4

1. **选那段视频。** 一次一个：WebM、MKV、MOV、M4V 或 MP4。浏览器直接从你的硬盘读它，页面会说它是什么：多长、多大、画面多大、装在什么容器里。
2. **读那两句话。** 一句说画面，一句说声音。每一句要么说这条轨道已经是 MP4 要的样子、会原样复制过去，要么说它现在是什么、会被重新编码成什么。没有什么要设的，文件自己决定。要是声音是浏览器读不了的格式，或者你宁愿这段视频没有声音，勾上那个框把声音去掉。
3. **转换，然后读那句写着「已核对」的话。** 该复制的复制，该重新编码的一帧一帧重新编码，进度条会说到哪了。然后做好的文件会在这里重新打开，它必须跟原来一样长、是 H.264、并且带着说好的声音。它在下载按钮下面从内存里播放，你能亲眼看到它还好好的。

## The longer version

[如何把视频转为普遍接受的 MP4](https://httcup.github.io/tools/guides/convert-a-video-to-mp4/): 可顺利上传的 MP4 包含什么，WebM、MKV 和 iPhone MOV 为何被拒，哪些转换无损，以及如何在浏览器中无需上传完成。

## Also in the box

- [视频旋转](https://httcup.github.io/tools/rotate-video/): 转四分之一圈、半圈，或者往另一边转。使用文件头旋转时，每一帧画面保持原样。
- [图片转视频](https://httcup.github.io/tools/images-to-video/): 一个文件夹的图片，变成一段视频。
- [视频剪切](https://httcup.github.io/tools/trim-video/): 一边看一边标出要留的段落，最后拿回一个视频。
- [视频裁剪](https://httcup.github.io/tools/crop-video/): 把片子切到只剩要紧的那块。

## Questions

### 画质会变差吗？

复制过去的部分不会，页面会说哪些是复制的。H.264 的帧和 AAC 的包一个字节不差地过去，所以一个里面是 H.264 的 MKV 出来就是画面一模一样的 MP4。非重新编码不可的轨道（VP9、VP8、AV1、HEVC 的画面；Opus、Vorbis、MP3、FLAC 的声音）会离相机远一代，码率按原文件花的量来定，所以丢的是一点而不是没有。无论哪种，都留着你的原文件。

### 为什么不把 HEVC 或 VP9 留在 MP4 里？它们更小。

因为那样的文件能打开的地方比你手上这个还少，而转换的意义就是让它到哪都能打开。MP4 里的 HEVC 需要机器可能没有的授权；MP4 里的 VP9 或 AV1 被大多数上传表单和每一个邮件客户端拒绝。H.264 加 AAC 是唯一没有人拒绝的组合，所以页面写的就是它，代价也事先说清，而不是藏起来。

### 我的 WebM 是录屏。声音能保住吗？

能。浏览器录的是 Opus，MP4 装不下它，所以会解码后重新编码成 160 kbit/s 的 AAC，比麦克风需要的多得多。画面（VP8 或 VP9）重新编码成 H.264。两样都在你的机器上做，做好的文件会在这里重新打开，核对它跟原来一样长、声音还在。

### 我的 MOV 为什么要转？它不就是 MP4 吗？

差不多。MOV 和 MP4 是同一个设计，一个里面是 H.264 和 AAC 的 MOV 几秒钟就原样复制过去，一帧都不重新编码，变的只是容器，而这正是那个只看扩展名的表单在拒绝的东西。里面是 HEVC 的 iPhone MOV 是另一种情况：画面会重新编码成 H.264，只要浏览器解得开 HEVC，大多数机器可以，但不是全部。

### 它读哪些文件？

WebM 和 MKV，画面是 VP8、VP9、AV1、H.264 或 HEVC，声音是 Opus、Vorbis、AAC、MP3 或 FLAC；MP4、MOV 和 M4V，画面是 H.264、HEVC、VP9 或 AV1，声音是 AAC。浏览器解不开的会点名：画面解不开就停下转换，声音解不开就去掉，画面照样转。AVI、WMV、FLV 和 MPEG-2 这里不读。

### 要多久？

复制大约等于把文件读两遍的时间：大多数视频几秒钟。重新编码要花你的机器编码画面所需的时间，有硬件编码器的话（大多数笔记本和近年的每一部手机都有）比视频本身还短；没有的话更慢，一段很长的 4K 视频怎么都要等一会儿。进度条会说到第几帧了，取消立刻停下，什么都不写。

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

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

### 手机上能用吗？

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

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

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

### 断网能用吗？

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

## How the privacy claim is verifiable

- **上传才是最慢的那一步，而这一步在这里不会发生。** 视频是大多数人这辈子要挪动的最大的文件，而每一个在线转换器都要先把整个文件拿到手：一个 GB 沿着你的网络传上去，为的是换一个不一样的 GB 传回来，上传花的时间通常比它换来的转换还长，这还没算谁留着那份文件的问题。这一页用从这个地址发来的代码读文件，用你浏览器里本来就有的编解码器写新文件，所以唯一在动的字节，是从你的硬盘到内存再回去。这一页的 `Content-Security-Policy` 列出了它可以联系的每一个地址，没有一个属于本站，而且断了网它照样能用。
- **这里的「MP4」是什么意思，以及为什么别的都不写。** 到哪都传得上去的那种文件，是普通 MP4 容器里的 H.264 画面加 AAC 声音。手机录出来的是它，每一个浏览器播的是它，聊天软件、邮件客户端和上传表单不问一句就收的也是它。WebM、MKV，或者里面装着 HEVC、VP9、AV1 的 MP4，被拒的地方多到人们会带着它来这里。所以这一页只写这一种。它从不把 H.264 之外的画面编码原样复制进结果，不管那个编码多好，因为一个能打开的地方比原文件还少的文件，不叫转换。
- **能复制的复制，非改不可的才重新编码，而且会说清是哪一种。** 转换不一定是重新编码。MKV 里的 H.264 帧和 MP4 要的是同一串字节，所以它们一帧一帧原样复制过去，什么都不丢；AAC 也一样。WebM 里的 VP9 或 VP8、iPhone MOV 里的 HEVC、声音里的 Opus 或 Vorbis：这些要解码后重新编码，结果离相机又远了一代。页面在你按任何东西之前就算好每条轨道是哪一种，用两句话说出来，好让「转换」这个词从来不用来遮住一次重新编码。
- **结果会重新打开核对一遍。** 一个丢了最后一秒、或者写了声音轨道却没写进声音的转换器，做出来的仍然是一个 MP4。所以做好的文件会在这里重新打开，用的就是读你上传那个文件的同一个读取器，它必须跟原来一样长、是 H.264、并且带着说好的声音。它在下载按钮下面从内存里播放，你保存之前就能亲眼看到它还好好的。
- **它在你机器上的代价，如实说。** 复制很快：文件读一遍拿布局，写的时候再读一遍。重新编码要花你的机器编码这段视频所需的时间，有硬件编码器的话（大多数笔记本和近年的每一部手机都有）比视频本身还短；没有的话会更慢，一段很长的 4K 视频怎么都要等一会儿。文件是分块从硬盘读的，所以进来的文件比内存还大也没问题，但做好的文件会一直放在内存里直到你下载它，笔记本的上限就在这里。「取消」随时有效。
- **它读哪些文件，不读哪些。** WebM 和 MKV（同一种格式的两个名字），里面可以是 VP8、VP9、AV1、H.264 或 HEVC 的画面，配 Opus、Vorbis、AAC、MP3 或 FLAC 的声音；还有 MP4、MOV 和 M4V，里面是 H.264、HEVC、VP9 或 AV1 的画面，配 AAC 的声音。浏览器解不开的画面（最常见的是没有授权的机器上的 HEVC）会点名拒绝；解不开的声音会点名去掉，画面照样转。AVI、WMV、FLV 和 MPEG-2 这里不读，页面会直说，而不是含糊地失败。
- **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/convert.js`；WebM 和 MKV 是怎么读的，看 `src/shared/mkv-reader.js`。这几个都够不着网络，旁边负责读和写的部分也一样。
