缩略语解析
0 缩略语解析DASH: over HTTP,是一项自适性串流技术,可将多媒体文件分割为一个或多个片段,并使用超文本传输协议传递给客户端。HLS:HTTP Live ,苹果公司提出基于HTTP的流媒体网络传输协议。CMAF: Media ,是一种可扩展的编码标准,通过指定一致的媒体包装和加密来实现内容和设备之间的互操作性。1 fMP4 是什么?
fMP4( MPEG-4) 是基于 MPEG-4 Part 12 的流媒体格式,其优点在于使用 DASH 或 HLS 进行流传输时,播放器仅需要下载观众想要看的片段。
其格式与 MP4(参考MP4格式详解)相似,主要的区别有:
fMP4 不需要一个 moov Box 来进行 ,moov Box 只包含了一些 track 信息;fMP4 的 信息与数据都存在一个个 (moof + mdat)。
image.png
2 MP4 to fMP4
在了解 fMP4 格式之前,先通过 来将普通的 MP4 文件转换成 fMP4 文件,来了解 fMP4 文件具体的存储形态与播放方式。
2.1 安装
这里通过 对 MP4 文件转换成 fMP4,可以通过官网下载安装,也通过通过 :
brew install bento4
2.2 工具转封装
提供了工具集,可以通过其官方文档查阅,这里主要用到了与两个工具:
image.png
使用 ,转换为 fMP4 格式,命令格式为(指定时长为2s):
mp4fragment --fragment-duration 2000 original.mp4 fragment.mp4
通过 .mp4命令查询确认 .mp4 已经转为 fMP4 格式:
image.png
使用 对 fmp4 文件进行切片:
mp4dash fragment.mp4
可查看其 MPEG DASH 数据:
├── audio
│ └── und
│ └── mp4a.40.2
│ ├── init.mp4
│ ├── seg-1.m4s
│ ├── seg-2.m4s
│ ├── seg-3.m4s
│ ├── seg-4.m4s
│ ├── seg-5.m4s
│ ├── seg-6.m4s
│ ├── seg-7.m4s
│ └── seg-8.m4s
├── stream.mpd
└── video
└── avc1
├── init.mp4
├── seg-1.m4s
├── seg-2.m4s
├── seg-3.m4s
├── seg-4.m4s
├── seg-5.m4s
├── seg-6.m4s
└── seg-7.m4s
2.3 DASH 数据播放
DASH 数据,可以通过 VLC 播放器打开 .mpd 文件播放,以验证是否正常:
image.png
3 fMP4 格式
fMP4 主要组成:ftyp + Movie * * N
image.png
可以通过 或者 查看 fMP4 文件格式,与 MP4 重复的内容这里就不重复陈述。
image.png
3.1 moov:mvex
mvex 是 fMP4 的标准 box,作用是告诉解码器这是一个fMP4的文件,具体的 信息内容不再放到 trak 里面,而是在每一个 moof 中。
image.png
mehd:查看分片的时长等信息
trex:给 fMP4 的 设置默认值
3.2 moof:traf
Track Box,存在 tfhd、tfdt、sdtp、trun 的容器。
image.png
3.2.1 tfhd
Track Box,主要是对指定的 trak进行相关的默认设置。
3.2.2 tfdt
Track Time Box,存放相关 编码的绝对时间的。因为 fMP4 是流式的格式,所以不像 MP4一样
可以直接根据 直接 seek 到具体位置。这里就需要一个标准时间参考,来快速定位都某个具体的 。
3.2.3 sdtp
and Box,主要是用来描述具体某个 是否是 i 帧,是否是 frame 等相关属性值,
主要用来作为当进行点播回放时的同步参考信息,不是必须 Box。
3.2.4 trun
Track Run Box,存储该 moof 里面相关的 内容。例如,每个 的 size、 、等。
4 fMP4 优势4.1 Trick-play
实现 Trick-play(快进、快退、慢动作等)支持,需要快速找到播放流中的关键帧,依据 fMP4 的特征,保证每个分片以 IDR 帧开始的,这就使得上述的方案实现非常简单。相对 TS 流时,没有办法保证关键帧的所在位置,需要解析多个 TS 才能找到关键帧的位置,fMP4 具体更快的优势。
image.png
4.2 无缝码流切换
无缝码流切换的关键在于:当第一个码流播放结束时,也就是发生切换的时间,第二个码流一定要以关键帧开始播放。
比如 TS 流因为不能保证每个 chunk 一定以关键帧开始,码流切换需要同时下载两个码流的相应分片,并同时解析两个码流,找到关键帧对应的位置才能切换。如果网络不好时,切换低码流时同时下载两个码流,会使卡顿变得更加明显。
fMP4中,保证每个分片以 IDR 帧开始的,还保证不同码流的分片在时间线上是对齐的。而且 fMP4 流音频视频数据分开存储,视频和音频的同步点可以不一样,视频可以以 GOP 边界作为同步点,音频可以以 sync frame 作为同步点,使得无缝码流切换更简单。无缝码流切换流程参看下图:
image.png
5 fMP4 与 CMAF
CMAF( Media )是由 、Apple、MLBAM、 等多媒体行业巨头向 MPEG 提出并于 2017 年获批准的国际标准。旨在解决媒体扩展性、传输低延迟、内容可缓存性等通用问题的综合性解决方案,降低流媒体传输的成本以及提升用户体验。
相对 fMP4,需要下载整个片段才能播放。使用 CMAF 的分块编码,加载到第一个分块即可播放,可以边下边播放,因此可实现更低时延的传输。
它们的本质区别是:fMP4 是切片文件流,CMAF 则是连续流。
image.png
6 参考文章Fun with – Part 2MPEG-DASH ( over HTTP)HTTP Live