跳到主要内容
AZ Tools

MP4 / ISO 基础媒体文件检查器

.mp4、.m4a、.m4v 和 QuickTime 的 .mov 其实是同一种容器,只是 ftyp 里盖的品牌不同。这个工具在浏览器内按 box 逐层读取它们,文件不会被上传。 它首先回答的是这个文件是不是快速启动。moov box 里放着文件中每一个样本的索引,如果它排在 mdat 后面,播放器就要等到最后一个字节到达才能开始播放——这正是同一段视频在本地秒开、通过 HTTP 传输时却要卡上一分钟的原因。 再往下是 box 树,按嵌套关系列出每个 box 的类型、偏移、声明大小以及占整个文件的比例,于是占空间的到底是媒体数据、过大的封面图,还是编辑软件留下的 free box,一眼就能看出来。 每条轨道会给出 ID、handler 是视频、音频、字幕还是提示轨、从样本条目读出的编解码器,以及在配置 box 可读时的完整 RFC 6381 字符串:avcC 得到 avc1.42C01E,esds 描述符得到 mp4a.40.2,vpcC 得到 vp09.00.30.08;视频轨另附画面尺寸,音频轨另附采样率与声道数。 时长以原始刻度数除以时间刻度的形式呈现,因为在不知道刻度是 600 还是 15360 之前,15360 这个数毫无意义;而且影片头也不是最终答案:轨道可能比影片时长更长,分片文件通常把影片时长留成 0,把总时长放进 mvex/mehd。 创建与修改时间按 ISO BMFF 从 QuickTime 继承来的 1904 年纪元换算,封装器留成 0 时显示为未设置——多数封装器正是如此。 声明的大小从不被轻信:某个 box 若声称比父 box 更大,会以带名字的错误拒绝而不是继续跟进;大小 0 读作“直到结尾”,大小 1 读作 64 位扩展大小,uuid box 的 16 字节扩展类型会在读取负载前跳过。 它不做解码:无法告诉你头部之后画面是否完好、声音是否为静音、编码器实际达到了多少码率,只能告诉你容器对自己的描述。

使用方法

  1. 把 .mp4、.m4a、.m4v 或 .mov 拖到方框里。只读取头部的 box,所以几个 GB 的影片和短片一样快。
  2. 先看快速启动那一行。如果是否,浏览器必须下载整个文件才能播放哪怕一秒;发布前请把 moov 移到最前面重新封装。
  3. 播放器拒绝播放时,检查主品牌和兼容品牌:"qt " 表示只声明 QuickTime 兼容,而网页播放器期待的是 "isom" 或 "mp42"。
  4. 展开轨道查看编解码器、该轨道自己的时间刻度与时长,以及画面尺寸或采样率。时长除以时间刻度就是秒数,工具把两者都列出来,算式一目了然。
  5. 在 box 树里找异常大的条目。小文件里的封面图或残留的 free box 可能占据惊人的比例,占比这一列会把它暴露出来。

常见问题

快速启动到底改变了什么?不是快速启动的文件怎么修?
moov box 就是索引:文件中每个样本的大小、时间戳和字节偏移都列在里面。播放器在解码任何内容之前都需要它,所以当 moov 被写在 mdat 之后(封装器默认就是这样,因为样本表要等最后一帧写完才完整),通过 HTTP 播放的浏览器就必须先下载整个文件,或者用 range 请求四处寻找 moov,才能显示第一帧。把它移到最前面完全不改动媒体数据,只是纯粹的重排,ffmpeg 用 -movflags +faststart 或任意 qt-faststart 类工具都能做。moov 一移动,stco 或 co64 里的所有 chunk 偏移都会跟着变,所以这必须是重写而不是复制。
时长为什么显示成两个数相除?
ISO 基础媒体文件把时间存成刻度,每个头部又各自带一个时间刻度,说明一秒有多少刻度。影片头常用 600 或 1000;视频轨往往用能被帧率整除的值,比如 15 fps 用 15360;音频轨几乎总是直接用采样率,也就是 44100 或 48000。所以 44032 这个数单看毫无意义:按 44.1 kHz 音频算是 1 秒,按 600 刻度的影片时钟算是 73 秒。显示除法而不只是结果,也让四舍五入变得可见——轨道时长不是影片刻度的整数倍,正是文件报出 5.98 秒而你以为是 6 秒的常见原因。
创建时间显示 1904 年或未设置,文件坏了吗?
没有。ISO BMFF 继承了 QuickTime 的纪元,起点是 1904 年 1 月 1 日 UTC 零点,而大量封装器根本不填这两个字段:ffmpeg 默认写 0,而 0 就是纪元本身。所以看起来像 1904 年创建的文件,实际上是由一个选择不说的工具生成的。即使填了值,也全是 UTC 且没有任何时区信息,因此时间戳说明不了拍摄地点,而且改起来毫不费力,单凭它证明不了任何事。
分片文件为什么看起来一个样本都没有?
分片 MP4 是 DASH、基于 fMP4 的 HLS 以及所有需要在崩溃后仍可用的录制所采用的结构:moov 里只保留轨道定义,加一个 mvex box 声明“后面还有分片”,真正的样本则由散布在文件各处的 moof box 描述,每个后面跟着自己的 mdat。因此 moov 里的样本表本来就是空的,影片时长通常也是 0,因为写头部时还不知道;总时长如果有人记录,会在 mvex/mehd 里。这也解释了为什么分片文件从任意位置截断后仍能播放到截断点,而普通的渐进式 MP4 不行。
MP4、M4A、M4V、MOV、3GP 为什么都能在这里打开?
它们本就是同一种格式。ISO/IEC 14496-12 定义了 box 结构,文件开头的 ftyp box 声明一个主品牌和一串兼容品牌。"M4A " 表示纯音频且是苹果风味,"M4V" 在此之上加了苹果的视频约定,"qt " 是其他一切的祖先——原始的 QuickTime 布局,"3gp4" 是移动端配置,而网页播放器寻找的通用品牌是 "isom" 或 "mp42"。扩展名只是给操作系统的提示,品牌列表才是真正的声明,两者不一致的情况够常见,所以文件放不出来时应该先看这里。
这个工具能修复文件或者改变 moov 的位置吗?
不能,它只读,而且故意读得尽量少:通过切片遍历 box 头部,mdat 从不进入内存,因此再大的影片也和小文件一样快。不上传任何内容,也不写回任何内容。如果 box 树因为“某个 box 声称的字节数超过文件”而中途停下,通常说明文件在传输中被截断或下载中断了;能救回来的是用剩下的分片重新封装,而不是改头部。

相关工具