MP4分析

MP4文件分析
概述
MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。

  • 一个MP4文件首先会有且只有一个“ftyp”类型的box,作为MP4格式的标志并包含关于文件的一些信息;

  • 之后会有且只有一个“moov”类型的box(Movie Box),它是一种container box,子box包含了媒体的metadata信息;

  • MP4文件的媒体数据包含在“mdat”类型的box(Midia Data Box)中,该类型的box也是container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由metadata进行描述。

mp4.jpg

文件结构
整个文件由Box组成,所有的数据都在Box内定义。Box可以层级嵌套,例如,moov可以包含多个trak。

aligned(8) class Box (unsigned int(32) boxtype, optional unsigned int(8)[16] extended_type)   
{  
  unsigned int(32) size;  
  unsigned int(32) type = boxtype;  
  if (size==1)   
   {  
    unsigned int(64) largesize;  
   }   
   else if (size==0)   
   {  
     // box extends to end of file  
   }  
   if (boxtype==‘uuid’) {  
      unsigned int(8)[16] usertype = extended_type;  
   }  
}  

note: 就是说一般情况下Box是以8个字节开头,接着就是Box的数据。这个8个字节分别表示size和type。size是整个Box的字节数,含size和type本身。type是4个可读的字符。例如:File Type Box的type就ftyp。 标准的type都是4个字符,如果要自定义的type,则需要把type设为"uuid",然后再附上16个字符作为自定义type.
参考代码


以一个长度为10秒的MP4为例,其结构可能如下:
type: ftyp, size: 24
type: mdat, size: 8884701
type: mdat, size: 136125
type: moov, size: 4656

  1. ftyp
    一个ftyp对文件的类型进行描述,指明其符合哪些格式。一般就是mp4格式了。符合本文档的媒体类型有很多种,box条目的种类也不同,所以需要brand与compatible_brands的来说明此文件内的box的种类。文档中定义了isom, avc1, iso2, mp71, iso3这些brand应有的格式,当解码器在读出其brand后,就知道该文件的格式了。

aligned(8) class FileTypeBox extends Box(‘ftyp’) {  
  unsigned int(32) major_brand;  
  unsigned int(32) minor_version;  
  unsigned int(32) compatible_brands[]; // to end of the box  
}  
  1. mdat

上例中有2个mdat,一个是视频内容、另一个音频内容。对于h264, aac编码的媒体来说,其视频mdat中内容是nal,对于音频来说,其内容为aac的一帧。mdat中的帧依次存放,每个帧的位置、时间、长度都由moov中的信息指定。可以看出,mdat是很好组建的,这种Box只含有数据。


aligned(8) class MediaDataBox extends Box(‘mdat’) {  
   bit(8) data[];  
}  
  1. moov

moov存放影片的所有信息,一个moov含有多个trak。通常对于一个片子来说,就是一个视频trak,一个音频trak。MP4文件的重点也在于此。



(1) trak / tkhd
对于视频trak,存宽、高信息;对于音频trak,存音量信息。并不是太重要,真正初始化解码器要靠 stsd中的信息。
(2) trak / mdia / hdlr
标明该trak是视频还是音频
(3) trak / mdia / minf / stbl
所有重要的表都在这里。其中,

  • stsd: 编码器CODEC信息
  • stsz: 用于sample的划分,通常一个sample可以对应于frame。
  • stsc: 多个sample组成一个trunk,不过实际操作中可以让一个sample直接构成一个trunk
  • stco: trunk在文件中的位置,用于定位。
  • stts / ctts: 指定每个sample的PTS, DTS
    (4) trak / edts / elst
    把视频分为多段segment, 每个的起始时间和时长。

MP4快速拉流
参考链接: Optimizing MP4 Video for Fast Streaming

看这段

You can see the browser makes 3 requests before it can start playing the video. In the first request, the browser downloads the first 552 KB of the video using an [HTTP range request](https://en.wikipedia.org/wiki/Byte_serving). We can tell this by the 206 Partial Content HTTP response code, and by digging in and looking at the request headers. However the moov
 atom is not there so the browser cannot start to play the video. Next, the browser requests the final 21 KB of the video file using another range request. This does contain the moov
 atom, telling the browser where the video and audio streams start. Finally, the browser makes a third and final request to get the audio/video data and can start to play the video. This has wasted over half a megabyte of bandwidth and delayed the start of the video by 210 ms! Simply because the browser couldn’t find the moov
 atom.

如果将moov放到最前面,可以减少两次请求,moov最重要的信息包括:stsd: 编码器CODEC信息,(音视频类型,宽高等),所以说,放在前面的话,如果网络很差的时候,减少两次请求就比较明显了。

至于说MP4文件在哪里调换moov的顺序,可以在写文件的时候,也可以后台服务器转码.
这部分的:参考代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容