1.先说几个基本概念
Sample: 采样,对于音视频来说就是一个编码帧;Sample_count即总帧数,Sample_index即帧下标。
在一个Chunk里面Sample顺序紧凑排列。
Tarck: 轨,是音频或者视频流信息定义的集合。一个轨包括一个或者多个Chunk。各轨之间有同步的问题。
Box(也叫atom): 盒,MP4文件各种信息定义的结构。一个MP4文件就是有很多个各种类型的Box组成的。
Box有固定的格式
4Bytes 4Bytes 8Bytes (Box_length-8)Bytes
b. box_length 包含了自己和4字节的type。因此一般情况下Box的负载是Box_length-8字节。
Box有两大类,一种是Container Box,这种Box里可以嵌套别的Box。它的负载就是其他的Box。
下图加^的Box就是Container Box。
另外一种就是单独的Box,里面定义某一些信息数据。
time_scale: 很多个Box里面都有time_scale,它定义了该媒体在1秒中内的采样刻度, 可以理解为一秒钟有多少个单元。
duration: 相对于time_scale的时间长度。真实的时长 = duration/time_scale。
例如我手头这个MP4文件,视频track的time_scale为25000. duration=9670000.
这样time = 9670000/25000 = 386.8s = 6m27s
不同Box定义的time_scale和duration可能是不同的,原因在于:
a. 文件时长和track时长本身就不一定是相同的,Mp4格式容许杂合多个不同长短不同起始时间的Tracks在同一个文件里面;
b. 一般mvhd,vmhd, smhd里面的time_scale,duration都不相同。所以一定注意要用同一组来计算。
2.一个基本的MP4文件Box结构如下:
Root (虚拟的没有这个box类型)
|----ftyp
|----moov^
| |----mvhd
| |----trak^
| | |----tkhd
| | |----mdia^
| | |----mdhd
| | |----hdlr
Sample: 采样,对于音视频来说就是一个编码帧;Sample_count即总帧数,Sample_index即帧下标。
在一个Mp4文件里面,所有Box处理的Samples都是严格按照帧序号排列的。
删除或者修改一帧,很多个Box里面的内容需要从新计算。
在一个Chunk里面Sample顺序紧凑排列。
Tarck: 轨,是音频或者视频流信息定义的集合。一个轨包括一个或者多个Chunk。各轨之间有同步的问题。
Box(也叫atom): 盒,MP4文件各种信息定义的结构。一个MP4文件就是有很多个各种类型的Box组成的。
Box有固定的格式
4Bytes 4Bytes 8Bytes (Box_length-8)Bytes
Box_length | Box_type | Box_long_length | Box_data
b. box_length 包含了自己和4字节的type。因此一般情况下Box的负载是Box_length-8字节。
Box有两大类,一种是Container Box,这种Box里可以嵌套别的Box。它的负载就是其他的Box。
下图加^的Box就是Container Box。
另外一种就是单独的Box,里面定义某一些信息数据。
time_scale: 很多个Box里面都有time_scale,它定义了该媒体在1秒中内的采样刻度, 可以理解为一秒钟有多少个单元。
duration: 相对于time_scale的时间长度。真实的时长 = duration/time_scale。
例如我手头这个MP4文件,视频track的time_scale为25000. duration=9670000.
这样time = 9670000/25000 = 386.8s = 6m27s
不同Box定义的time_scale和duration可能是不同的,原因在于:
a. 文件时长和track时长本身就不一定是相同的,Mp4格式容许杂合多个不同长短不同起始时间的Tracks在同一个文件里面;
b. 一般mvhd,vmhd, smhd里面的time_scale,duration都不相同。所以一定注意要用同一组来计算。
2.一个基本的MP4文件Box结构如下:
Root (虚拟的没有这个box类型)
|----ftyp
|----moov^
| |----mvhd
| |----trak^
| | |----tkhd
| | |----mdia^
| | |----mdhd
| | |----hdlr