ftyp(File Type Box)
box有且只有1个,并且只能被包含在文件层,而不能被其他box包含。该box应该被放在文件的最开始,知道应该使用哪种协议对这该文件解析,是后续解读文件基础。
moov
box包含了文件媒体的metadata信息,“moov”是一个container box,具体内容信息由子box,比如包含多个trak(视频流,音频流),moov第一个box一般是mvhd。
mvhd
mvhd(Movie Header Box),主要存放着视频文件的meta data
字段 | 字节数 | 意义 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box类型 |
version | 1 | box版本, 0或者1, 一般为0(以下字节数均按照version=0) |
flags | 3 | 扩展的movie header标志 |
creation | 4 | 创建时间(相对于UTC时间1904-01-01 0点秒数 |
modification | 4 | 修改时间 |
time scale | 4 | 文件媒体在1秒时间内的刻度值, 可以理解为1秒长度的时间单元数 |
duration | 4 | 该tack的时间长度, 用duration和time scale值可以计算track时长, 比如audio track的time scale = 8000, duration = 560128, 时长为70.016, video track 的time scale = 600, duration = 42000, 时长为70 |
rate | 4 | 推荐播放速率, 高16位和低16位分别为小数点整数播放和小数部分, 即[16, 16] 格式, 该值为1.0(0x00010000) 表示正常前向播放 |
volume | 2 | 与rate类型, [8, 8]格式, 1.0 (0x0100) 表示最大音量 |
reserved | 10 | 保留位 |
matrix | 36 | 视频转换矩阵 |
pre-defined | 24 | 未使用 |
next track id | 4 | 下一个track使用的id号,未使用 |
影片视频长度如何计算
- 从 mvhd - movie header atom 中找到 time scale 和 duration,duration 除以 time scale 即是整部电影的长度。
time scale 相当于定义了标准的 1 秒在这部电影里面的刻度是多少
例如 audio track 的 time scale = 8000, duration = 560128,所以总长度是 70.016,video track 的 time scale = 600, duration = 42000,所以总长度是 70
- 首先计算出共有多少个帧,也就是 sample(从 sample size atoms 中得到),然后
整部电影的 duration = 每个帧的 duration 之和(从 Time-to-sample atoms 中得出)
例如 audio track 共有 547 个 sample,每个 sample 的长度是 1024,则总 duration 是 560128,电影长度是 70.016;video track 共有
1050 个 sample,每个 sample 的长度是 40,则总 duration 是 42000,电影长度是 70
tkhd(Track Header Box)
每个trak都包含了一个tkhd,记录时间,空间和音量信息。
字段 | 字节数 | 意义 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box类型 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) |
flags | 3 | 按位或操作结果值,预定义如下:0x000001 track_enabled,否则该track不被播放;0x000002 track_in_movie,表示该track在播放中被引用;0x000004 track_in_preview,表示该track在预览时被引用。一般该值为7,如果一个媒体所有track均未设置track_in_movie和track_in_preview,将被理解为所有track均设置了这两项;对于hint track,该值为0 |
creation time | 4 | 创建时间(相对于UTC时间1904-01-01零点的秒数) |
modification time | 4 | 修改时间 |
track id | 4 | id号,不能重复且不能为0 |
reserved | 4 | 保留位 |
duration | 4 | track的时间长度 |
reserved | 8 | 保留位 |
layer | 2 | 视频层,默认为0,值小的在上层 |
alternate group | 2 | track分组信息,默认为0表示该track未与其他track有群组关系 |
volume | 2 | [8.8] 格式,如果为音频track,1.0(0x0100)表示最大音量;否则为0 |
reserved | 2 | 保留位 |
matrix | 36 | 视频变换矩阵 |
width | 4 | 宽 |
height | 4 | 高,均为 [16.16] 格式值,与sample描述中的实际画面大小比值,用于播放时的展示宽高 |
edts
不是必须的,将时间线映射在media时间线上。
mdia
track的媒体类型和sample数据,例如音频或视频,包含一个media header atom ('mdhd'),一个handler reference ('hdlr'),一个媒体信息引用('minf')和用户数据atom('udta').
mdhd
主要定义了该Track的媒体头信息,最重要的两个字段是Time scale和Duration,分别表示了该Track的时间戳和时长信息,这个时间戳信息也是PTS和DTS的单位。
字段 | 字节数 | 意义 |
---|---|---|
box size | 4 | box大小 |
box type | 4 | box类型 |
version | 1 | box版本,0或1,一般为0。(以下字节数均按version=0) |
flags | 3 | 该Box该字段填充0 |
creation time | 4 | 当前Track创建时间(相对于UTC时间1904-01-01零点的秒数) |
modification time | 4 | 当前Track修改时间(相对于UTC时间1904-01-01零点的秒数) |
timescale | 4 | 当前Track的时间计算单位 |
duration | 4 | 该Track的播放时长,需要参考前面的timescale计算 |
language | 2 | 媒体语言码,参考其他标准 |
qualiiy | 2 | 媒体的回放质量 |
hdlr
解释了媒体的播放过程信息,用来设置不同Track的处理方式,标识了该Track的类型。
hand sub type,视频:‘vide’,音频:‘soun
minf
最复杂box,包含多个子box,建立时间到真实音视频sample的映射关系
stbl
Sample是媒体数据的存储单元,其中存储在Media的chunk中,每个Sample的时间和位置、编解码信息、和chunk关系等都是由Stbl Box来描述的,Stbl Box包含了Track中media媒体的所有时间和索引,利用这个容器的Sample信息,就可以定位Sample的媒体时间、类型、大小以及和其相邻的Sample。同时该Box是必须在Trak Box中存在的。
stsd
采样描述容器: Sample Description即stsd Box
stts
采样时间容器: Time To Sample 即stts Box
stss
采样同步容器: Sync Sample即stss Box
stsc
Chunk采样容器: Sample To Chunk即stsc Box
stsz
采样大小容器: Sample Size即stsz Box
stco
Chunk偏移容器:Chunk Offest即Stco Box
ctts
该Box保存了每个sample的composition time和decode time之间的差值,这里通过Composition Time就可以计算出Sample的PTS。
mdat
mdat Box这个Box是存储音视频数据的Box,要从这个Box解封装出真实的媒体数据。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。