MP4 文件:里面装的是什么,该转成什么
MP4 里究竟装了什么、为什么同一个扩展名能装完全不同的编码、哪些转换是无损的。在浏览器里转换 MP4,文件不上传。
速览
- 类型
- 视频
- 容器格式
- 是
- 扩展名
- .mp4
- MIME 类型
- video/mp4
- 常见编码
- h264, h265, av1, aac
- 别称
- MPEG-4 Part 14
MP4 是容器,不是编码——关于这个格式几乎所有令人困惑的地方,都可以从这一点推出来。文件本身是一棵嵌套的盒子树(规范里叫 box,老一些的工具叫 atom),由 ISO/IEC 14496-14 定义,而它又是 ISO 基础媒体文件格式的一个 profile,后者源自苹果贡献出来的 QuickTime。实际用起来只有两个盒子要紧:moov 是描述每条轨道的索引,mdat 是那一大坨真正的压缩帧数据。
展开说明
正因为容器只负责描述轨道,两个文件可以都是合法的 MP4,却毫无共同之处。一个装 H.264 视频加 AAC 音频,下一个装 H.265,再下一个装 AV1;能播第一个的播放器可能打不开第三个,而它们的扩展名都是 .mp4,MIME 类型都是 video/mp4。所以「MP4 在这儿能用吗」这个问题没有通用答案;也正因如此,MP4 转 MOV 或 MKV 通常是瞬间完成的,而转 WebM 不是——前者是重新装箱,后者要把每一帧重新编码。
moov 这个索引还解释了 -movflags +faststart 的用处,本站输出的每个 MP4 都加了它。编码器天然会把 moov 放在文件末尾,因为轨道时长只有编码结束才知道。于是通过 HTTP 边下边播的播放器必须等到最后一个字节才能开始。faststart 会把文件重写一遍、把索引挪到前面:导出时多花一趟,换来播放立刻就能开始。
命名只是惯例,不是规则。.m4a 是只装音频的 MP4,.m4v 是苹果的视频变体,.mp4 是通用情形——三者是同一个容器,改名并不等于转换。改名也不是捷径:这里提取音频存成 M4A 是重新编码的,并没有把原有的 AAC 轨原样搬过去,所以和转成 MP3 一样是第二次有损,只不过留在同一个编码家族里。
把 MP4 转成其他格式
把其他格式转成 MP4
MP4常见问题
MP4 是有损还是无损?
都不是——容器本身不表态,取决于里面装的轨道。实际情况里 MP4 几乎总是装着有损的 H.264 或 H.265 视频和有损的 AAC 音频,所以你手上那个文件基本可以肯定是有损的,但这是编码的属性,不是 MP4 的属性。
为什么我的 MP4 在某些设备上放不出来?
扩展名不告诉播放器任何编码信息。用了 H.265 或 AV1 视频的文件,在只能解 H.264 的硬件上就是打不开,尽管两个文件都是合规的 MP4。转成「H.264 视频 + AAC 音频」的 MP4 兼容性最广,本站输出的就是这一种。
MP4 的哪些转换是无损的?
MP4 转 MOV、MKV 和 M4V——前提是里面的编码在目标容器里本来就合法。这类转换走的是流复制:压缩帧原样搬过去,视频逐比特相同。发生时页面上会显示「直接复制未重新编码」。任何改变编码的转换(MP4 转 WebM、MP4 转 MP3)都必然重新编码。
MP4、M4A、M4V 有什么区别?
同一个容器,只是习惯上装的东西不同:M4A 只装音频,M4V 是苹果的视频变体,MP4 是通用情形。改扩展名不改变字节,所以它不转换任何东西——但可能让播放器猜错。
本站能处理多大的 MP4?
取决于你转成什么,因为这个上限约束的是「工作过程中要同时容纳多少」,而不是输入本身。提取音频在桌面端可到 2 GB,因为输出只有源文件的一小部分;换容器约 667 MB,因为输出和输入一样大;手机端一律 512 MB。超过 64 MB 的文件会在原地读取而不是拷进转换器内存,正是这一点让 GB 级输入成为可能。每个上传框都会显示当前那对格式的真实数字。
在这里转换 MP4 会上传我的视频吗?
不会。解封装和编码都在你浏览器的后台线程里,用 ffmpeg 的 WebAssembly 构建完成。开始之前打开网络面板看一眼:没有任何请求携带这个文件。
为什么 MP4 转 WebM 比 MP4 转 MKV 慢那么多?
MKV 接受 H.264,所以视频轨是复制过去的,整个任务基本就是重写一遍文件。WebM 既不接受 H.264 也不接受 AAC,所以每一帧都得解码再重新编码成 VP8 或 VP9——这是实打实的压缩计算,跑在你的 CPU 上。
可以从 MP4 里取一张静态图吗?
可以,而且有一点值得知道:你得到的是解码出来的某一帧,再重新编码成 PNG 或 JPG。因为源帧本身已经是有损的,所以它的 PNG 只是相对那一帧无损,并非相对原始画面无损。