查看mp4内部盒子的解码器
mp4Explorer MP4Reader
或者线上解码
辅助 ascii 编码
进制转换
初始的盒子解码。
aipaiVideoDataMain.js
加载本地Mp4
我这里使用的是fetch 使用Chrome 里面机制里面的每节的buffer 返回。(辣鸡火狐没有这个机制)
每次返回的buffer 的数据都在 ChunkData 里面。
解析每个chunkBuffer 数据都存起来。
开始时候每个mp4都必须先解析视频头文件数据,才能进行解码。
正常的mp4盒子 是有 moov 总盒子和mdat 数据盒子。
Ftyp: 正常是存在的,free 可能有可能没有。
Ftyp: 盒子是一定是32字节。然后这个没有什么用。
Free: 没有用
Moov :属于记录 视频的全部信息。
Mvhd : 属于视频的总时长获取数据。Timescale 是每秒单位数量 Duration 是总时 长。video 的盒子一般会和视频长度相等,声音会略短
Trak 分别是 video 和 audio 的区分。一般是 video 在前面。
Tkhd 是这个trak 的总时长,如果是video 的会有视频的宽高信息。
Mdia 是里面的盒子的详细信息。、
Mdhd timeScale 在里面是一秒有30单位 Duration
Hdlr 是用来区分这个trak盒子是哪种类型的。视频盒子为vide 声音盒子 为 soun。
Minf
Stbl 主要用到这个盒子。其他盒子需要单独去看那个盒子的特俗功能一般 用不了其他盒子。
Stsd 这个是记录视频的视频的 code 一般在video 盒子里面。
Stts 这个是一个总的sample 数量 和每个单位时间占的sample 数 量级别
Stss 这个是关键帧数据 计算时间为
当前point /( mdhd盒子的timeScale /stts的Smaple delta)
Stsc sample在同一个时间戳下会连续有几个smaple。
Stsz 每个sample的大小
Stco 属于每个时间戳下的sample的开始偏移量
Ctts 属于每个时间戳下的cts 偏移量,如果发现视频声音不同步都属 于偏移量的问题。
按照上面博客里面介绍的box 盒子的分布。除了个别特殊的盒子。其他盒子都是 盒子长度+盒子名字+盒子数据。
所以单独弄成了解析
在刚开始获取数据时候会不停的检测盒子是否进入 mdat 情况。
里面会解析盒子的数据。
在trakBox.js里面。
在ffmprg 里面 数据是一截截的。所以我把 数据按照 一个关键帧来分开。
在card.mp4里面
120 个 sample 为一个视频数据。
大部分声音的trak box 里面是没有stss 关键帧的盒子。所以 声音数据切割时候也要按照视频关键帧来分布声音。不然在mse 的机制里面会报错。
在这里我是用每个sample 占领的时间戳来计算关键帧的数量,然后分布的置入数据。
在keyOffsetData() 方法里面了解。
其中 sps 的 和B站那里搬过来用的。具体可以去独立解码 这里会很复杂。视频的很多基础信息都在里面。 而我需要的只有里面的 video code 和 audio code .
当到达mdat 盒子时候。就开始初始化 mediaSource。
如果你是ts 直接分开的就不需要创建2个mediaSourceBuffer.
然后开始遍历之前的保存 buffer数据。
然后开始appendSegments ();
按照关键帧顺序置入到mediaSourceBuffer里面。Video 和 audio 要分开置入。 video 和 audio 的mediaSourceBuffer 置入。在控制台那里就会有缓存显示。