给flv.js添加解封装器(demuxer)

估计也没人再写了

  1. 需要一个probe函数验证文件格式有效
  2. 在transmuxing-controller里添加判断,创建demuxer
  3. 需要一个parseChunks函数负责demux由io-ctl传来的文件流,参数0为未使用的arrayBuffer,参数1为相对文件头的字节偏移量
  4. 自行识别mediaInfo,在完成后调用onMediaInfo传回媒体信息
  5. 音视频流分别回调onTrackMetadata将轨道信息传给remuxer
  6. parseChunks中将音视频采样分别放置于独立track中,并调用onDataAvailable通知remuxer进行封装

终于整完了mp4 demuxer

想了挺久分段mp4的播放有什么解决方案,看着flvjs眼馋,然后一直想坑,但是又懒于开工

于是趁着这个五一,刚好前两周学校里的好几科期中也考完了,开坑!

QQ截图20170501003619

说是五一开坑,其实二十多号复制了个segment-mp4-player的时候就已经开始去翻着找mp4格式说明了。

以前听过song神说过mp4的box地狱,但是并不特别懂。正式看资料以后才算是真正理解。

具体细节就不说了,真的好奇就看文档

读取moov的时候,为了省事,我直接上了一个递归函数,一劳永逸,然后只要把boxName给switch一下具体parse就可以了。

其实mp4的格式真正读起来不会特别复杂,理清层级关系,明白自己在做什么,要获取什么,也就能顺路完成。

相比起读数据,我倒是觉得读完后整理数据才是真正的大头,比如把关键帧梳理出一个timestamp->fileposition的表才是最考验逻辑的。写的时候整个人脑子处于一种混乱的状态,最后是在顶不住选择了稳妥的列逻辑,一步步理出数据

QQ截图20170501003659

至于主要数据流的mdat部分,这部分完全就是一整片数据堆砌。同样,这里是另一个需要强逻辑的地方,每次读sample都需要先在已有的moov数据里面找到对应offset是谁的采样、采样时间戳是多少、采样有多大。我在这里直接选择了提前生成一个chunkMap,读取起来那叫一个爽快

QQ图片20170501003806

一路写代码的途中也是经常和xqq大佬交流(骚扰),也学到了很多

大概也就是这么些,说到底写出来还是个自用的东西,这年头自己做视频播放谁还专门整分段mp4

QQ图片20170501004141

gayhub