兴化网站开发,wordpress是h5页面跳转,网站建设注册哪类商标,百度最新招聘信息1、readMetaData 必须要找到 Moov box#xff0c;找到 Mdat box或者 Moof box#xff0c;并且创建了 ItemTable
大端
box 分为 box header 和 box content#xff1a; box header由8个字节组成#xff0c;前面四个字节表示这个box 的大小#xff08;包含这个头的8字节找到 Mdat box或者 Moof box并且创建了 ItemTable
大端
box 分为 box header 和 box content box header由8个字节组成前面四个字节表示这个box 的大小包含这个头的8字节 box size有3中可能第一种是正常大小读出来就是box的大小 这里是包含box header 的 8个字节的 第二种box size 为 1说明这个box 大小是 large size也就是所说的 mdat box数据 box size 为 0 时表示box是文件的最后一个box这个box的大小需要用文件的大小减去偏移量得到
紧接着的是 4个字节的 box typebox content 大小正常大小时box content size size -8box size 为 1时需要继续往后读8位这就是 mdat 中数据的长度ftyp无关紧要
moov包含有文件媒体的元数据信息这是一种嵌套盒子必须且只能有一个 moov box mvhd boxmovie header box描述了具体音频或视频流无关的文件整体信息duration为媒体时长和timescale为时长单位。具体的文件多长需要用这里的duration / timescale 由于这是个嵌套盒子所以里面会有递归解析的步骤
trak: 包含了该track的媒体数据的引用和描述 tkhd: track header , 存储有 track 头信息包含track-id用于显示的宽高display-width/display-height mdiatrack media structure 描述了这条音视频track的媒体数据样本的主要信息 mdhdmedia header存储有media track 信息但是和 tkhd中的信息是不一样的这里可以读取到 track 的duration 以及对应的 timescale文件时长依旧使用 duration / timescale 计算 hdlr minfmedia info vmhdvideo media handler type对应的还有 smhd用于记录 audio type dinfdata information stblsample table检查到有这个box则会当前 trak 建立sample table stsd子box用于存储当前track的编码类型以及解码所需要的信息重要的是解析内部的盒子 hvc1/av01/avc1类似于这些boxbox名称也就是编码类型一般box里面会有视频的宽高如果是 AVC/HEVC 这种里面还会嵌套有avcC这种信息这些都是解码需要的信息不同的类型解析方式会有点不一样。 stsssync sample box这个box中存储的是关键帧的序号这个box的第四到八字节表示关键帧的数量所有的关键帧的偏移量都以uint32 的形式存储在后面的数据中读出以后需要按照4个字节来划分出来如果没有这个表那么说明每个samp都是关键帧或者说是一个随机存取点 sttssetTimeToSampleParams 这个box中存储了每个sample以及其对应的duration和上面的box 类似第四到八个字节表示 sample的数量之后的属于以 sampleNumber–duration的形式排列 stszset sample size里面记录的是每个sample的大小 stscsetSampleToChunkParams用chunk组织sample可以方便优化数据获取一个thunk包含一个或多个sample。“stsc”中用一个表描述了sample与chunk的映射关系查看这张表就可以找到包含指定sample的thunk从而找到这个sample。 stcosetChunkOffsetParams定义了每个chunk在媒体流中的位置 ctss
mdat数据放在这个box中帧信息放在 stbl 中
数据如何构建
数据如何读取mp4 中的数据都是放在 mdat box中的而且audio和video混在一起我们想要读取一帧数据那么就要知道数据的 offsetsize以及其对应的pts我们应该如何获取这些内容呢 首先我们要知道需要读取的哪一帧这里会有两种情况一种是seek跳跃读取另一种就是顺序读取 seek需要根据时间查找对应的关键帧拿到该帧的索引 顺序读取记录当前读到的帧的索引
读取该帧索引的信息例如偏移量大小是否为关键帧帧的时间长度。这里的问题是应该如何根据帧索引获取这些信息呢 首先要根据帧索引找到对应的 Chunk 索引和chunk 的偏移量根据索引在chunk中的位置计算sample的偏移量再根据stsz 和 stts box中的信息读取到sample 大小和 持续时长