终于整完了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

4 thoughts on “终于整完了mp4 demuxer”

    1. 不是解析的问题,moov在文件尾部的话,需要读到mdat之后让io ctrl跳转到mdat结束,然后读取完再跳转回开头,逻辑比较魔性,目前的线上站也没有这个需求(都是文件头moov的),就没写

  1. 哥们,这个可能帮了我大忙,我也正准备入坑搞这个,幸亏先搜到了你这篇文章,还没下载测试,先留言表示一下感激

    1. 搞分段mp4播放?
      如果要用的话建议用我的fork源最新的master生成,前几天加了东西,没更新release

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax