mp4 文件格式系列





























































































































































不同。sample-to-chunk atom存储sample与chunk的映射关系。
Sample-to-chunk atoms的类型是'stsc'。它也有一个表来映射sample和trunk之间的关系,查看这张表,就可以找到包含指定sample的trunk,从而找到这个sample。
 
字段      长度(字节)  描述
尺寸         4         这个atom的字节数 类型         4         stsc
版本         1         这个atom的版本 标志         3         这里为0
条目数目     4         sample-to-chunk的数目 sample-to-chunk          sample-to-chunk表的结构
First chunk    4         这个table使用的第一个chunk序号 Samples per chunk   4    当前trunk内的sample数目
Sample description ID  4   与这些sample关联的sample description的序号  
mp4文件格式系列25(续) - Sample-to-Chunk Atoms - STSC
First chunk    Samples per chunk   Sample description ID 1            4                 1 4            3                 1 5            4                 1 8            3                 1 9            4                 1 …           …                …  
这个表类似于行程编码,第一个first chunk减去第二个first chunk就是一共有多少个trunk包含相同的sample数目,这样通过不断的叠加,就可以得到一共有280个trunk,每个trunk包含多少个sample,以及每个trunk对应的description。 
mp4文件格式系列26 - Sample Size Atoms - STSZ
sample size atoms定义了每个sample的大小,它的类型是'stsz',包含了媒体中全部sample









的数目和一张给出每个sample大小的表。这样,媒体数据自身就可以没有边框的限制。
 
字段    长度(字节) 描述
尺寸        4     这个atom的字节数 类型        4     stsz
版本        1     这个atom的版本 标志        3     这里为0
Sample size  4     全部sample的数目。如果所有的sample有相同的长度,这个字段就是
这个值。否则,这个字段的值就是0。那些长度存在sample size表中
条目数目    4     sample size的数目
sample size         sample size表的结构。这个表根据sample number索引,第一项就是第
一个sample,第二项就是第二个sample
大小        4     每个sample的大小  
mp4文件格式系列27 - Chunk Offset Atoms - STCO
Chunk offset atoms 定义了每个trunk在媒体流中的位置,它的类型是'stco'。位置有两种可能,32位的和64位的,后者对非常大的电影很有用。在一个表中只会有一种可能,这个位置是在整个文件中的,而不是在任何atom中的,这样做就可以直接在文件中找到媒体数据,而不用解释atom。需要注意的是一旦前面的atom有了任何改变,这张表都要重新建立,因为位置信息已经改变了。









 
字段      长度(字节)    描述
尺寸           4       这个atom的字节数 类型           4       stco
版本           1       这个atom的版本 标志           3       这里为0
条目数目       4       chunk offset的数目
chunk offset            字节偏移量从文件开始到当前chunk。这个表根据chunk number
索引,第一项就是第一个trunk,第二项就是第二个trunk
大小          4        每个sample的大小  
[mp4文件格式]获取mp4文件信息1 - 计算电影长度wqyuwss 
方法1: 从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
方法2 :首先计算出共有多少个帧,也就是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 
mp4文件格式]获取mp4文件信息3 - 计算电影声音采样频率wqyuwss 
从tkhd – track header atom中找出audio track的time scale即是声音的采样频率。 
[mp4文件格式]获取mp4文件信息2 - 计算电影图像宽度和









高度wqyuwss 
从tkhd – track header atom中找到宽度和高度即是。 
[mp4文件格式]获取mp4文件信息4 - 计算视频帧率wqyuwss 
首先计算出整部电影的duration,和帧的数目然后  帧率 = 整部电影的duration / 帧的数目 
[mp4文件格式]获取mp4文件信息5 - 计算电影的比特率wqyuwss
整部电影的尺寸除以长度,即是比特率,此电影的比特率为846623/70 = 12094 bps 
[mp4文件格式]获取mp4文件信息6 - 查找samplewqyuwss 
当播放一部电影或者一个track的时候,对应的media handler必须能够正确的解析数据流,对一定的时间获取对应的媒体数据。如果是视频媒体, media handler可能会解析多个atom,才能找到给定时间的sample的大小和位置。具体步骤如下: 1.确定时间,相对于媒体时间座标系统
2.检查time-to-sample atom来确定给定时间的sample序号。 3.检查sample-to-chunk atom来发现对应该sample的chunk。 4.从chunk offset atom中提取该trunk的偏移量。
5.利用sample size atom找到sample在trunk内的偏移量和sample的大小。 例如,如果要找第1秒的视频数据,过程如下: 1.  第1秒的视频数据相对于此电影的时间为600 2.  检查time-to-sample atom,得出每个sample的duration是40,从而得出需要寻找第600/40 = 15 + 1 = 16个sample 3.  检查sample-to-chunk atom,得到该sample属于第5个chunk的第一个sample,该chunk共有4个sample
4.  检查chunk offset atom找到第5个trunk的偏移量是20472
5.  由于第16个sample是第5个trunk的第一个sample,所以不用检查sample size atom,trunk的偏移量即是该sample的偏移量20472。如果是这个trunk的第二个sample,则从sample size atom中找到该trunk的前一个sample的大小,然后加上偏移量即可得到实际位置。 6.  得到位置后,即可取出相应数据进行解码,播放 
[mp4文件格式]获取mp4文件信息7 - 查找关键帧wqyuwss 
查找过程与查找sample的过程非常类似,只是需要利用sync sample atom来确定key frame的sample序号
确定给定时间的sample序号 
检查sync sample atom来发现这个sample序号之后的key frame 









检查sample-to-chunk atom来发现对应该sample的chunk  从chunk offset atom中提取该trunk的偏移量 
利用sample size atom找到sample在trunk内的偏移量和sample的大小 
[mp4文件格式]获取mp4文件信息8 - Random accesswqyuwss 
Seeking主要是利用sample table box里面包含的子box来实现的,还需要考虑edit list的影响。
可以按照以下步骤seek某一个track到某个时间T,注意这个T是以movie header box里定义的time scale为单位的:
如果track有一个edit list,遍历所有的edit,找到T落在哪个edit里面。将Edit的开始时间变换为以movie time scale为单位,得到EST,T减去EST,得到T',就是在这个edit里面的duration,注意此时T'是以movie的time scale为单位的。然后将T'转化成track媒体的time scale,得到T''。T''与Edit的开始时间相加得到以track媒体的time scale为单位的时间点T'''。  这个track的time-to-sample表说明了该track中每个sample对应的时间信息,利用这个表就可以得到T'''对应的sample NT。 
sample NT可能不是一个random access point,这样就需要其他表的帮助来找到最近的random access point。一个表是sync sample表,定义哪些sample是random access point。使用这个表就可以找到指定时间点最近的sync sample。如果没有这个表,就说明所有的sample都是synchronization points,问题就变得更容易了。另一个shadow sync box可以帮助内容作者定义一些特殊的samples,它们不用在网络中传输,但是可以作为额外的random access point。这就改进了random access,同时不会影响正常的传输比特率。这个表指出了非random access point和random access point之间的关系。如果要寻找指定sample之前最近的shadow sync sample,就需要查询这个表。总之,利用sync sample和shadow sync表,就可以seek到NT之前的最近的access point sample Nap。 
找到用于access point的sample Nap之后,利用sample-to-chunk表来确定sample位于哪个chunk内。 
找到chunk后,使用chunk offset找到这个chunk的开始位置。 
使用sample-to-chunk表和sample size表中的数据,找到Nap在此chunk内的位置,再加上此chunk的开始位置,就找到了Nap在文件中的位置。 

发布了7 篇原创文章 · 获赞 23 · 访问量 25万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章