MP4是个非常通用的文件格式。直播一般用FLV的多,譬如录制成FLV。录制成MP4会比较麻烦些。SRS已经支持了MP4解析,下一步就是录制MP4,以及FMP4,还有MPEG-DASH的支持。
为什么NGINX-RTMP和SRS都录制成了FLV?实际上FLV是个流格式,而MP4不是。FLV可以支持多个编码头,通俗的说,就是编码器改变编码参数后推流到服务器时,编码头是和之前不一样的,如果录制的文件需要跨越多次不同的编码头,也就是说一个录制的文件中有多个编码头,只有FLV才能支持,MP4是不能支持的。
不过一般情况下,编码头是不变的。那就是复杂性了,FLV协议只有11页,MP4协议有196页,HLS是216页(TS是174页,M3U8是42页),DASH是329页(MP4是196页,DASH是133页)。可以比较出来MP4是仅次于HLS的一个复杂格式,而DASH比HLS又复杂更多,DASH底下用的FMP4格式。这些在SRS的doc下面都有,描述参考:https://github.com/ossrs/srs/issues/299#issuecomment-275829253
SRS要走向国际用户,DASH是必须要支持的,要支持DASH就绕不开MP4了。就先顺手支持了MP4的muxer和demuxer,才能做DASH。而MP4的demuxer就可以顺手支持一个srs ingest mp4的工具,采集MP4文件,转成RTMP推到服务器,和srs ingest flv类似,当然和FFMPEG也类似。
MP4的demuxer,参考https://github.com/ossrs/srs/issues/738,有详细的描述。总结的说来,MP4是一个个的BOX,从高层看,MP4有三种组织方式:
参考:https://github.com/ossrs/srs/issues/738#issuecomment-277250722
MP4的STSD BOX包含了Sample的offset和timestamp信息,具体解析过程参考:https://github.com/ossrs/srs/issues/738#issuecomment-277436990
编码头例如H.264的SPS/PPS,AAC的ASC,它们在FLV中叫Sequence Header,在MP4中的组织方式参考:H.264参考https://github.com/ossrs/srs/issues/738#issuecomment-276882539,以及AAC参考https://github.com/ossrs/srs/issues/738#issuecomment-276893934。其中AAC用到了ESDS这个BOX,是定义在14496-1-System中的,特别是BaseDescription的变长比较隐晦(FFMPEG直接把1-4字节的变长弄成了4字节的定长)。
而MP4的timestamp,也就是DTS和PTS(CTS),解析出来后,需要做一个偏移处理,保证音频和视频的混合单增,如果不处理可以在SRS开启mix_correct矫正,参考:https://github.com/ossrs/srs/issues/738#issuecomment-277489566。
经过12天的学习和写代码实践,对于MP4已经了然于胸了。这12天主要是过年,加上年纪大了所以每天平均下来只有2到3小时的时间在弄MP4。不过看着标准文档写代码,是一种享受,有了解全局的一种好的感觉。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有