缩写:
HLS:HTTP Live Streaming
ABR:Adaptive Bit Rate
DASH:Dynamic Adaptive Streaming over HTTP
查找HLS的切片格式的时候发现有ABR/DASH/FMP4等新概念,记录下这些概念,以备后续使用!
普通MP4,fMP4,DASH的组成部分差异:
普通MP4 | fMP4 | DASH(MPEG-DASH) |
---|---|---|
ftyp moovmdat | moofmdatmoofmdat | Initialization SegmentMedia SegmentMedia Segment |
MPEG-DASH支持TS和MP4 / ISO BMFF媒体段。HLS只支持MPEG-2 TS。DASH媒体段通常比HLS短,2至4秒比较常见。DASH不需要特定的编解码器。视频可以使用H264编码,也可以用其他编码,VP9和H265也是比较受欢迎的编码。一般而言,与HLS相比,DASH可以提供实质上更低的端对端延迟。这对于现场直播的工作流程很重要。此外, MPEG-DASH的基于模板的MPD不需要更新,可以在网络边缘服务器进行缓存,HLS则需要周期性地更新传播多次。
MP4
MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式(也可以理解为视频的封装格式,对应H264/H265/VP9等视频编码格式而言),对应的标准为ISO/IEC 14496-12,即信息技术视听对象编码的第12部分:ISO 基本媒体文件格式(Information technology Coding of audio-visual objects Part 12: ISO base media file format)。
一些概念:
track:表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。
hint track:这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。
sample:对于非hint track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。
sample table:指明sampe时序和物理布局的表。
chunk:一个track的几个sample组成的单元。
Suffixes = ".mp4", ".m4a"; Mac OS Type = "mpg4"; Mac OS Creator = "TVOD";
MIME="video/mp4" and "audio/mp4"
普通MP4 由索引文件头文件moov box和媒体数据mdat box组成,MP4基本的box为:
MP4 -> ftyp box
moov box
mdat box
fMP4
fMP4 是基于 MPEG-4 Part 12 的流媒体格式,RFC: ISOBMFF,与 mp4 很相似,但也有一些区别:
- fMP4 不需要一个 moov Box 来进行 initialization,fMP4 的 moov Box 只包含了一些 track 信息。
- fMP4 的 视频/音频 metadata 信息与数据都存在一个个 moof、mdat 中,它是一个流式的封装格式。
之前理解MP4文件不支持流式播放,这种理解是错误的,MP4的格式本身是支持边下载边播放的,并不需要下载完整的MP4文件,但需要长时间缓冲MP4头部数据,而fMP4区别于MP4最大的一点,则是更好的适应流式播的需求
fMP4 由分片组成,可以按整个文件存储,也可以按分片存储:
- 如果按照单个文件存储,每个输出是一个m4s文件。 完整的fMP4视频可以描述为如下形式:
moov (moof mdat) * N
其中moof box是分片(fragment)的标识, mdat box存放的是当前分片的媒体数据;
- 如果按照分片存储,每个分片是一个m4s文件,输出对应了多个m4s。
fMP4中的第一个分片,对应了DASH协议中Initialization Segment;其后的分片,则对应Media Segment。
DASH
什么是DASH,简单理解是一种服务端、客户端的流媒体解决方案,维基百科DASH的定义:
DASH is an adaptive bitrate streaming technology where a multimedia file is partitioned into one or more segments and delivered to a client using HTTP.
当前Android的ExoPlayer支持MPEG-DASH,YouTube、Netflix、三星、索尼、松下等TV上支持MPEG-DASH。
如果使用HLS支持ABR,则限制条件很多,参考(https://blog.csdn.net/vn9PLgZvnPs1522s82g/article/details/84207032),要求每个分片的起始的IDR帧在PTS上面一定要对齐的,如果不对齐的话,不同码率切换就不是无缝切换,而DASH则很好的解决了这个问题。
DASH服务端:
将视频内容分割为一个个分片,每个分片可以存在不同的编码形式(不同的codec、profile、分辨率、码率等);
DASH播放器端:
就可以根据自由选择需要播放的媒体分片,可以实现adaptive bitrate streaming技术,不同画质内容无缝切换,提供更好的播放体验。
DASH中的重要概念
MPD :媒体文件的描述文件(manifest),作用类似HLS的m3u8文件。MPD文件以XML格式组织,其层次结构参图1。
Representation :对应一个可选择的输出(alternative)。如,480p video,720p video, 44100采样 audio,22050采样audio,都使用Representation描述。
Segment(分片) :每个Representation会划分为多个Segment。Segment分为4类,其中,最重要的是:Initialization Segment(每个Representation都包含1个Init Seg),Media Segment(每个Representation的媒体内容包含若干Media Seg)!
支持fmp4封装的开源项目:
https://github.com/samsha1971/rtsp2fmp4/tree/master/rtsp2fmp4
https://github.com/ireader/media-server
MPEG-DASH 开源Library:
https://github.com/bitmovin/libdash
MPEG-DASH标准:
https://standards.iso.org/ittf/PubliclyAvailableStandards/c075485_ISO_IEC_23009-1_2019.zip
https://w3c.github.io/media-source/isobmff-byte-stream-format.html
参考:
https://github.com/liwf616/awesome-live-stream/wiki
https://www.shangmayuan.com/a/f53015d71afd4ed6b2ba63ca.html
http://xhelmboyx.tripod.com/formats/mp4-layout.txt
https://juejin.im/post/5dd119b5f265da0bf350d19b
https://segmentfault.com/a/1190000008810572