前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MP4格式解析

MP4格式解析

作者头像
Winlin
发布于 2022-03-18 09:10:38
发布于 2022-03-18 09:10:38
1.9K0
举报
文章被收录于专栏:SRS开源服务器SRS开源服务器

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有三种组织方式:

  1. 普通MP4,General MP4,box模式为ftyp-mdat-moov。头在后面,FFMPEG默认出的就是这种,写入比较简单。读取时需要seek;所以有些浏览器会需要完全下载后才能开始播放,有些应该可以用HTTP RANGE跳过mdat读取moov。SRS录制MP4文件可以用这种模式。
  2. 快速MP4,Faststart MP4,box模式为ftyp-moov-mdat。头在前面,FFMEPG需要指定参数,生成MP4后,再过一遍文件才能支持。比上面的对于某些浏览器会比较友好,但是就需要再过一遍文件。对于SRS录制成MP4文件而言,容易造成IO阻塞(等待的时间过长,导致服务线程挂起,具体看ST的实现,不可以长时间的做CPU操作或者磁盘操作)。
  3. 切片MP4,Fragmented MP4,或FMP4,box模式为ftyp-moov-moof-mdat。分段模式,浏览器H5直接播放时,有些能播,有些不行。这种一般用在DASH中,不会直接用浏览器播放,而是通过JS解析后,给MSE播放(APPEND到Video对象的Buffer中去,具体参考MSE的文章)。FFMPEG也是需要指定参数才能生成。这种对于流媒体比较合适,SRS生成DASH可以用这种。

参考: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。不过看着标准文档写代码,是一种享受,有了解全局的一种好的感觉。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SRS开源服务器 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档