软编码Flv 到Mp4 容器(五) fmp4 ftyp box 和moov>mvhd box详解

来源:互联网 发布:换头型软件 编辑:程序博客网 时间:2024/06/10 12:59

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数据


 - 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

首先对应标题的box在 fmp4容器中的位置


ftyp box

Box Type: `ftyp’ //box类型
Container: File //父级box
Mandatory: Yes //是否强制性存在
Quantity: Exactly one //仅有一个

aligned(8) class FileTypeBox   extends Box(‘ftyp’) {   unsigned int(32)  major_brand;  //4字节的品牌名称   unsigned int(32)  minor_version; //4字节的版本号   unsigned int(32) compatible_brands[]; //内容4字节的兼容品牌数组}

上段代码是官方pdf的ftyp box定义

FTYP = new Uint8Array([            0x69, 0x73, 0x6F, 0x6D,             // major_brand: isom        isom    MP4  Base Media v1             //[IS0 14496-12:2003]   ISO YES video/mp4            0x0, 0x0, 0x0, 0x1, // minor_version: 0x01            0x69, 0x73, 0x6F, 0x6D, // isom            0x61, 0x76, 0x63, 0x31 // avc1        ]);

fmp4的ftyp就是上面所写, 4字节长度+4字节’ftyp’+FTYP对象,就是完整的ftyp box


moov box

Box Type: ‘moov’ //box名称
Container: File //box父级,这里是顶级
Mandatory: Yes //是否强制存在
Quantity: Exactly one //仅有一个

aligned(8) class MovieBox extends Box(‘moov’){ }

由上可见moov box是一个容器box,所以它本身没有任何描述,4字节moov box长度(这里的长度是指包含moov里面全部box的总长度,而不是只有’moov’4个字节的长度)+4字节的’moov’就是moov的全部描述


moov>mvhd box

Box Type: ‘mvhd’ //box名称
Container: Movie Box (‘moov’) //box父级,这里是moov
Mandatory: Yes //是否强制存在
Quantity: Exactly one //仅有一个

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      //通常版本为0   unsigned int(32)  creation_time;   //媒体创建时间 相对于UTC时间1904-01-01零点的秒数)   unsigned int(32)  modification_time; //修改时间   unsigned int(32)  timescale;//刻度值,可以理解为1秒的长度   unsigned int(32)  duration;//时长}template int(32)  rate = 0x00010000; //typically 1.0  //播放速率,高16和低16分别表示小数点前后整数部分和小数部分template int(16)  volume = 0x0100;   //typically, full volume  //声音,高8位和低8位分别表示小数点前后整数和小数部分const bit(16)  reserved = 0;  //2字节保留位const unsigned int(32)[2]  reserved = 0; //4+4字节保留位template int(32)[9]  matrix ={ 0x00010000,0,0,0,0x00010000,0,0,0,0x40000000 };                        // Unity matrix视频变换矩阵bit(32)[6]  pre_defined = 0;  //6*4保留位unsigned int(32)  next_track_ID; //4字节的下一个track id}

上面代码是mp4官方文档定义的

首先我们看到,mvhd box继承的是full box(‘mvhd’,version,0)
full box 是box的增强box,后面跟4个字节,第一个字节是版本,后面3个字节是保留位

var MVHD= new Uint8Array([            0x00, 0x00, 0x00, 0x00, // version(0) + flags     1位的box版本+3位flags   box版本,0或1,一般为0。(以下字节数均按version=0)            0x00, 0x00, 0x00, 0x00, // creation_time    创建时间  (相对于UTC时间1904-01-01零点的秒数)            0x00, 0x00, 0x00, 0x00, // modification_time   修改时间            (timescale >>> 24) & 0xFF, // timescale: 4 bytes        文件媒体在1秒时间内的刻度值,可以理解为1秒长度            (timescale >>> 16) & 0xFF,            (timescale >>> 8) & 0xFF,            (timescale) & 0xFF,            (duration >>> 24) & 0xFF, // duration: 4 bytes  该track的时间长度,用duration和time scale值可以计算track时长,比如audio track的time scale = 8000, duration = 560128,时长为70.016,video track的time scale = 600, duration = 42000,时长为70            (duration >>> 16) & 0xFF,            (duration >>> 8) & 0xFF,            (duration) & 0xFF,            0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0   推荐播放速率,高16位和低16位分别为小数点整数部分和小数部分,即[16.16] 格式,该值为1.0(0x00010000)表示正常前向播放            0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)  与rate类似,[8.8] 格式,1.0(0x0100)表示最大音量             0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes    保留位            0x00, 0x00, 0x00, 0x00,            0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00, //视频变换矩阵   线性代数            0x00, 0x00, 0x00, 0x00,            0x00, 0x01, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00,            0x40, 0x00, 0x00, 0x00, // ----end composition matrix----            0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00, //pre-defined 保留位            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00,            0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----            0xFF, 0xFF, 0xFF, 0xFF // next_track_ID 下一个track使用的id号        ])

mvhd是一个full box,所以它没有子box了,它最终的表现是 4字节长度+4字节’mvhd’+MVHD对象,就是一个完整的mvhd box

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