MPEG4Extractor

1、readMetaData 必须要找到 Moov box,找到 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 type

box content 大小:正常大小时,box content size = size -8
			      box size 为 1时,需要继续往后读8位,这就是 mdat 中数据的长度

ftyp:无关紧要

moov:包含有文件媒体的元数据信息,这是一种嵌套盒子(必须且只能有一个 moov box)

mvhd box:movie header box,描述了具体音频或视频流无关的文件整体信息,duration为媒体时长和timescale为时长单位。具体的文件多长需要用这里的duration / timescale

由于这是个嵌套盒子,所以里面会有递归解析的步骤

trak: 包含了该track的媒体数据的引用和描述

tkhd: track header , 存储有 track 头信息(包含track-id,用于显示的宽高(display-width/display-height))

mdia:track media structure 描述了这条音视频track的媒体数据样本的主要信息

mdhd:media header,存储有media track 信息,但是和 tkhd中的信息是不一样的,这里可以读取到 track 的duration ,以及对应的 timescale,文件时长依旧使用 duration / timescale 计算

hdlr:

minf(media info):

vmhd(video media handler type):对应的还有 smhd,用于记录 audio type

dinf(data information):

stbl(sample table):检查到有这个box,则会当前 trak 建立sample table

stsd:子box用于存储当前track的编码类型,以及解码所需要的信息,重要的是解析内部的盒子

hvc1/av01/avc1:类似于这些box,box名称也就是编码类型,一般box里面会有视频的宽高,如果是 AVC/HEVC 这种,里面还会嵌套有avcC这种信息,这些都是解码需要的信息,不同的类型解析方式会有点不一样。

stss:sync sample box,这个box中存储的是关键帧的序号,这个box的第四到八字节表示关键帧的数量,所有的关键帧的偏移量都以uint32 的形式存储在后面的数据中,读出以后需要按照4个字节来划分出来(如果没有这个表,那么说明每个samp都是关键帧,或者说是一个随机存取点)

stts:setTimeToSampleParams 这个box中存储了每个sample以及其对应的duration,和上面的box 类似,第四到八个字节表示 sample的数量,之后的属于以 sampleNumber--duration的形式排列;

stsz:set sample size,里面记录的是每个sample的大小

stsc:setSampleToChunkParams,用chunk组织sample可以方便优化数据获取,一个thunk包含一个或多个sample。"stsc"中用一个表描述了sample与chunk的映射关系,查看这张表就可以找到包含指定sample的thunk,从而找到这个sample。

stco:setChunkOffsetParams,定义了每个chunk在媒体流中的位置

ctss:

mdat:数据放在这个box中,帧信息放在 stbl 中

数据如何构建:

数据如何读取:mp4 中的数据都是放在 mdat box中的(而且audio和video混在一起),我们想要读取一帧数据,那么就要知道数据的 offset,size,以及其对应的pts,我们应该如何获取这些内容呢?

首先我们要知道需要读取的哪一帧,这里会有两种情况,一种是seek跳跃读取,另一种就是顺序读取:

seek:需要根据时间查找对应的关键帧,拿到该帧的索引

顺序读取:记录当前读到的帧的索引

读取该帧索引的信息,例如偏移量,大小,是否为关键帧,帧的时间长度。这里的问题是应该如何根据帧索引获取这些信息呢?

首先要根据帧索引找到对应的 Chunk 索引和chunk 的偏移量,根据索引在chunk中的位置,计算sample的偏移量,再根据stsz 和 stts box中的信息读取到sample 大小和 持续时长

相关推荐
贺biubiu19 小时前
2025 年终总结|总有那么一个人,会让你千里奔赴...
android·程序员·年终总结
xuekai2008090119 小时前
mysql-组复制 -8.4.7 主从搭建
android·adb
nono牛20 小时前
ps -A|grep gate
android
未知名Android用户21 小时前
Android动态变化渐变背景
android
行业探路者21 小时前
二维码标签是什么?主要有线上生成二维码和文件生成二维码功能吗?
学习·音视频·语音识别·二维码·设备巡检
nono牛1 天前
Gatekeeper 的精确定义
android
stevenzqzq1 天前
android启动初始化和注入理解3
android
城东米粉儿1 天前
compose 状态提升 笔记
android
粤M温同学1 天前
Android 实现沉浸式状态栏
android
Android系统攻城狮1 天前
Android16音频之获取Record状态AudioRecord.getState:用法实例(一百七十七)
音视频·android16·音频进阶