mp4解码介绍

MP4 2进制解码,历史有很多大能都已经给出了最优的方案了。

转载: http://blog.sina.com.cn/s/blog_48f93b530100jz4b.html

http://blog.sina.com.cn/s/blog_48f93b530100jz4x.html

http://blog.sina.com.cn/s/blog_48f93b530100jz5f.html

http://blog.sina.com.cn/s/blog_48f93b530100jz5p.html

 

查看mp4内部盒子的解码器

mp4Explorer       MP4Reader

或者线上解码  

http://mp4parser.com/

 

辅助 ascii 编码

http://www.qqxiuzi.cn/bianma/ascii.htm

进制转换

http://tool.oschina.net/hexconvert/

 

 

初始的盒子解码。

aipaiVideoDataMain.js

加载本地Mp4

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

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

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

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

mp4解码介绍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 /sttsSmaple delta

                                         Stsc  sample在同一个时间戳下会连续有几个smaple

                                         Stsz  每个sample的大小

                                         Stco 属于每个时间戳下的sample的开始偏移量

                                         Ctts 属于每个时间戳下的cts 偏移量,如果发现视频声音不同步都属 于偏移量的问题。

 

 

按照上面博客里面介绍的box 盒子的分布。除了个别特殊的盒子。其他盒子都是 盒子长度+盒子名字+盒子数据。

所以单独弄成了解析

mp4解码介绍

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

里面会解析盒子的数据。

trakBox.js里面。

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

card.mp4里面

mp4解码介绍

120 sample 为一个视频数据。

大部分声音的trak box 里面是没有stss 关键帧的盒子。所以 声音数据切割时候也要按照视频关键帧来分布声音。不然在mse 的机制里面会报错。

在这里我是用每个sample 占领的时间戳来计算关键帧的数量,然后分布的置入数据。

keyOffsetData() 方法里面了解。

其中 sps 的 和B站那里搬过来用的。具体可以去独立解码 这里会很复杂。视频的很多基础信息都在里面。 而我需要的只有里面的 video code audio code .

 

当到达mdat 盒子时候。就开始初始化 mediaSource

如果你是ts 直接分开的就不需要创建2mediaSourceBuffer.

然后开始遍历之前的保存 buffer数据。

然后开始appendSegments ();

按照关键帧顺序置入到mediaSourceBuffer里面。Video audio 要分开置入。 video audio mediaSourceBuffer 置入。在控制台那里就会有缓存显示。