想了挺久分段mp4的播放有什么解决方案,看着flvjs眼馋,然后一直想坑,但是又懒于开工
于是趁着这个五一,刚好前两周学校里的好几科期中也考完了,开坑!
说是五一开坑,其实二十多号复制了个segment-mp4-player的时候就已经开始去翻着找mp4格式说明了。
以前听过song神说过mp4的box地狱,但是并不特别懂。正式看资料以后才算是真正理解。
具体细节就不说了,真的好奇就看文档啊
读取moov的时候,为了省事,我直接上了一个递归函数,一劳永逸,然后只要把boxName给switch一下具体parse就可以了。
其实mp4的格式真正读起来不会特别复杂,理清层级关系,明白自己在做什么,要获取什么,也就能顺路完成。
相比起读数据,我倒是觉得读完后整理数据才是真正的大头,比如把关键帧梳理出一个timestamp->fileposition的表才是最考验逻辑的。写的时候整个人脑子处于一种混乱的状态,最后是在顶不住选择了稳妥的列逻辑,一步步理出数据
至于主要数据流的mdat部分,这部分完全就是一整片数据堆砌。同样,这里是另一个需要强逻辑的地方,每次读sample都需要先在已有的moov数据里面找到对应offset是谁的采样、采样时间戳是多少、采样有多大。我在这里直接选择了提前生成一个chunkMap,读取起来那叫一个爽快
一路写代码的途中也是经常和xqq大佬交流(骚扰),也学到了很多
大概也就是这么些,说到底写出来还是个自用的东西,这年头自己做视频播放谁还专门整分段mp4
嗯,我fork的最新的。看到你在gayhub上介绍,不支持moov box在尾部的文件,我还没仔细看代码,不晓得这个是否有帮助
https://github.com/video-dev/hls.js/blob/master/src/demux/mp4demuxer.js
🙂
不是解析的问题,moov在文件尾部的话,需要读到mdat之后让io ctrl跳转到mdat结束,然后读取完再跳转回开头,逻辑比较魔性,目前的线上站也没有这个需求(都是文件头moov的),就没写
哥们,这个可能帮了我大忙,我也正准备入坑搞这个,幸亏先搜到了你这篇文章,还没下载测试,先留言表示一下感激
搞分段mp4播放?
如果要用的话建议用我的fork源最新的master生成,前几天加了东西,没更新release