软编码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
- 软编码Flv 到Mp4 容器(五) fmp4 ftyp box 和moov>mvhd box详解
- 软编码Flv 到Mp4 容器(六) fmp4 moov>trak>tkhd box 和 moov>trak>mdia>mdhd box讲解
- 软编码Flv 到Mp4 容器(十三) fmp4 生成ftyp和moov所必要的 flv数据
- 软编码Flv 到Mp4 容器(十一) fmp4 moof box详解
- 软编码Flv 到Mp4 容器(十二) fmp4 mdat 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 容器(外传一)avcc box
- 软编码Flv 到Mp4 容器(四) fmp4 总览和基础讲解
- MP4文件格式详解——元数据moov(一)mvhd box
- 多媒体 MP4文件格式详解——元数据moov(一)mvhd box
- MP4文件格式详解——元数据moov(一)mvhd box
- MP4文件格式详解——元数据moov(一)mvhd box(转)
- MP4文件格式详解——元数据moov(一)mvhd box
- MP4文件格式详解——元数据moov(一)mvhd box
- MPEG4 笔记(FTYP,MOOV,MVHD)
- Variable has existed/does not exist ,Did you mean to set reuse=True/None?
- Sass使用for循环
- 如何使用retrofit2网络框架
- 外观模式-Facade
- OPC client 编写预备知识
- 软编码Flv 到Mp4 容器(五) fmp4 ftyp box 和moov>mvhd box详解
- java 正则表达式\\b
- java程序初始化的顺序是怎么样的?
- Java利用iText7画个性化表格
- 蓝桥杯基础练习 回形取数
- mysql 列传行 行转列 个人总结
- zookeeper应用案例——服务器列表动态更新
- 《机器学习实战》笔记
- UVA