查看mp4内部盒子的解码器

mp4Explorer       MP4Reader

或者线上解码  

Online MPEG4 Parser

辅助 ascii 编码

ASCII编码转换,ASCII码在线查询工具

进制转换

在线进制转换

初始的盒子解码。

aipaiVideoDataMain.js

加载本地Mp4

我这里使用的是fetch  使用Chrome 里面机制里面的每节的buffer 返回。(辣鸡火狐没有这个机制)

每次返回的buffer 的数据都在 ChunkData 里面。

解析每个chunkBuffer 数据都存起来。

开始时候每个mp4都必须先解析视频头文件数据,才能进行解码。

android mp4解密 mp4视频解密_mp4解码

android mp4解密 mp4视频解密_video_02

正常的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 盒子的分布。除了个别特殊的盒子。其他盒子都是 盒子长度+盒子名字+盒子数据。

所以单独弄成了解析

android mp4解密 mp4视频解密_mp4Box_03

在刚开始获取数据时候会不停的检测盒子是否进入 mdat 情况。

里面会解析盒子的数据。

在trakBox.js里面。

在ffmprg 里面 数据是一截截的。所以我把 数据按照 一个关键帧来分开。

在card.mp4里面

android mp4解密 mp4视频解密_mp4Box_04

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 置入。在控制台那里就会有缓存显示。