软编码Flv 到Mp4 容器(四) fmp4 总览和基础讲解

来源:互联网 发布:语音识别算法 编辑:程序博客网 时间:2024/06/05 20:46

https://github.com/332065255/flv2fmp4

代码库


软编码Flv 到Mp4 容器(一)
软编码Flv 到Mp4 容器(二) flv tag拆解
软编码Flv 到Mp4 容器(三) flv metadata tag解析
软编码Flv 到Mp4 容器(四) fmp4 总览和基础讲解
软编码Flv 到Mp4 容器(五) fmp4 ftyp box 和moov>mvhd box详解
软编码Flv 到Mp4 容器(六) fmp4 moov>trak>tkhd box 和 moov>trak>mdia>mdhd box讲解
软编码Flv 到Mp4 容器(七) fmp4 mdia>hdlr box 和 mdia>minf> smhd 和dinf box讲解
软编码Flv 到Mp4 容器(八) fmp4 mdia>stbl>stsd box 讲解
软编码Flv 到Mp4 容器(九) fmp4 stts stsc stsz stco box 讲解
软编码Flv 到Mp4 容器(十) fmp4 mvex box 讲解
软编码Flv 到Mp4 容器(十一) fmp4 moof box详解
软编码Flv 到Mp4 容器(十二) fmp4 mdat box详解
软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据


首先约定几个定义

1、 文件,由许多Box和FullBox组成。
2、 Box,每个Box由Header和Data组成。
3、 FullBox,是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags。

4、 Header,包含了整个Box的长度size和类型type。
当size==0时,代表这是文件中最后一个Box;当size==1时,意味着Box长度需要更多bits来描述,在后面会定义一个64bits的largesize描述Box的长度;当type是uuid时,代表Box中的数据是用户自定义扩展类型。
5、 Data,是Box的实际数据,可以是纯数据也可以是更多的子Boxes。
6、 当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。

Container box意思是容器box,里面会包含更多的box, 代表有moov box
full box是单个box,里面不会包含更多的box,代表有mvhd box
full box 组成如下:4字节长度+4字节box type+1字节版本+3字节保留位+各种box特有内容

标准的box开头的4个字节(32位)为box size,该大小包括box header和box body整个box的大小,这样我们就可以在文件中定位各个box。如果size为1,则表示这个box的大小为large size,真正的size值要在largesize域上得到。(实际上只有“mdat”类型的box才有可能用到large size。)如果size为0,表示该box为文件的最后一个box,文件结尾即为该box结尾。(同样只存在于“mdat”类型的box中。)
size后面紧跟的32位为box type,一般是4个字符,如“ftyp”、“moov”等,这些box type都是已经预定义好的,分别表示固定的意义。如果是“uuid”,表示该box为用户扩展类型。如果box type是未定义的,应该将其忽略。


下面是一段 标准的mp4开头二进制代码

00000000h: 00 00 00 1C  66 74 79 70     6D 70 34 32     00 00 00 00 ;                   1c长度为28   f   t  y  p     m  p   4  2      0   0  0  000000010h: 6D 70 34 32  6D 70 34 31     69 73 6F 6D     00 00 04 63 ;             这12个字节表明的是兼容品牌       到此28字节结束   0x4631123                                        ftyp box结束            m  p  4  2   m  p  4  1      i  s  o  m00000020h: 6D 6F 6F 76  00 00 00 6C     6D 76 68 64     00 00 00 00 ;            m   o  o  v   6c为 108        m  v  h  d                                        mvhd box为fullbox,所以0x00000000为内容moov为容器,所以后4个字节为下个box的长度

mvhd的box内容比较繁琐,就不全部贴出来了,下面是官方mp4文档的mvhd的详细说明

aligned(8) class MovieHeaderBox extends FullBox(‘mvhd’, version, 0) {     if (version==1) {   unsigned int(64)  creation_time;   unsigned int(64)  modification_time;   unsigned int(32)  timescale;   unsigned int(64)  duration;} else { // version==0   unsigned int(32)  creation_time;   unsigned int(32)  modification_time;   unsigned int(32)  timescale;   unsigned int(32)  duration;}template int(32)  rate = 0x00010000; //template int(16)  volume = 0x0100;   //const bit(16)  reserved = 0;const unsigned int(32)[2]  reserved = 0;template int(32)[9]  matrix =typically 1.0typically, full volume{ 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };      // Unity matrix   bit(32)[6]  pre_defined = 0;   unsigned int(32)  next_track_ID;}

一个正常的fmp4文件,他的box排序是下面的这种情况

 - ftyp - moov     - mvhd     - trak         - tkhd         - mdia             - mdhd             - hdlr             - minf                 - smhd                 - dinf                     - dref                         - url                 - stbl                     -  stsd                         - mp4a(avc1)                             - esds(avcC)                     - stts                     - stsc                     - stsz                     - stco     - mvex        -trex - moof    - mfhd    - traf        -tfhd        -tfdt        -sdtp        -trun - mdat

由上图可见..fmp4 box非常复杂,所以本系列博客也是循序渐进,一步一步的来讲每个box的情况.

本章我们主要讲解了box和 fmp4的box组合情况

下一章我们来讲解fmp4中 ftyp和moov中mvhd的详细情况

阅读全文
0 0
原创粉丝点击