0 縮略語(yǔ)解析
- DASH:Dynamic Adaptive Streaming over HTTP,是一項(xiàng)自適性串流技術(shù)绪妹,可將多媒體文件分割為一個(gè)或多個(gè)片段,并使用超文本傳輸協(xié)議傳遞給客戶端。
- HLS:HTTP Live Streaming器钟,蘋果公司提出基于HTTP的流媒體網(wǎng)絡(luò)傳輸協(xié)議。
- CMAF:Common Media Application Format妙蔗,是一種可擴(kuò)展的編碼標(biāo)準(zhǔn)傲霸,通過(guò)指定一致的媒體包裝和加密來(lái)實(shí)現(xiàn)內(nèi)容和設(shè)備之間的互操作性。
1 fMP4 是什么眉反?
fMP4(Fragmented MPEG-4) 是基于 MPEG-4 Part 12 的流媒體格式昙啄,其優(yōu)點(diǎn)在于使用 DASH 或 HLS 進(jìn)行流傳輸時(shí),播放器僅需要下載觀眾想要看的片段寸五。
其格式與 MP4(參考MP4格式詳解)相似梳凛,主要的區(qū)別有:
- fMP4 不需要一個(gè) moov Box 來(lái)進(jìn)行 initialization,moov Box 只包含了一些 track 信息梳杏;
- fMP4 的 metadata 信息與數(shù)據(jù)都存在一個(gè)個(gè) Segment(moof + mdat)韧拒。
2 MP4 to fMP4
在了解 fMP4 格式之前,先通過(guò) bento4 來(lái)將普通的 MP4 文件轉(zhuǎn)換成 fMP4 文件十性,來(lái)了解 fMP4 文件具體的存儲(chǔ)形態(tài)與播放方式叛溢。
2.1 安裝 bento4
這里通過(guò) bento4 對(duì) MP4 文件轉(zhuǎn)換成 fMP4,可以通過(guò)官網(wǎng)下載安裝劲适,也通過(guò)通過(guò) hombrew :
brew install bento4
2.2 工具轉(zhuǎn)封裝
bento4 提供了工具集雇初,可以通過(guò)其官方文檔查閱,這里主要用到了mp4fragment
與mp4dump
兩個(gè)工具:
使用 mp4fragment
减响,轉(zhuǎn)換為 fMP4 格式靖诗,命令格式為(指定fragment時(shí)長(zhǎng)為2s):
mp4fragment --fragment-duration 2000 original.mp4 fragment.mp4
通過(guò) mp4dump fragment.mp4
命令查詢確認(rèn) fragment.mp4 已經(jīng)轉(zhuǎn)為 fMP4 格式:
使用 mp4dash
對(duì) fmp4 文件進(jìn)行切片:
mp4dash fragment.mp4
可查看其 MPEG DASH 數(shù)據(jù):
├── 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 數(shù)據(jù)播放
DASH 數(shù)據(jù),可以通過(guò) VLC 播放器打開(kāi) stream.mpd 文件播放支示,以驗(yàn)證是否正常:
3 fMP4 格式
fMP4 主要組成:ftyp + Movie Metadata * Fragment * N
可以通過(guò) MP4Box 或者 ISOViewer 查看 fMP4 文件格式刊橘,與 MP4 重復(fù)的內(nèi)容這里就不重復(fù)陳述。
3.1 moov:mvex
mvex 是 fMP4 的標(biāo)準(zhǔn) box颂鸿,作用是告訴解碼器這是一個(gè)fMP4的文件促绵,具體的 samples 信息內(nèi)容不再放到 trak 里面,而是在每一個(gè) moof 中嘴纺。
mehd:查看分片的時(shí)長(zhǎng)等信息
trex:給 fMP4 的 sample 設(shè)置默認(rèn)值
3.2 moof:traf
Track Fragment Box败晴,存在 tfhd、tfdt栽渴、sdtp尖坤、trun 的容器。
3.2.1 tfhd
Track Fragment Header Box闲擦,主要是對(duì)指定的 trak進(jìn)行相關(guān)的默認(rèn)設(shè)置慢味。
3.2.2 tfdt
Track Fragment Decode Time Box场梆,存放相關(guān) sample 編碼的絕對(duì)時(shí)間的。因?yàn)?fMP4 是流式的格式纯路,所以不像 MP4一樣
可以直接根據(jù) sample 直接 seek 到具體位置或油。這里就需要一個(gè)標(biāo)準(zhǔn)時(shí)間參考,來(lái)快速定位都某個(gè)具體的 fragment驰唬。
3.2.3 sdtp
Independent and Disposable Samples Box顶岸,主要是用來(lái)描述具體某個(gè) sample 是否是 i 幀,是否是 leading frame 等相關(guān)屬性值叫编,
主要用來(lái)作為當(dāng)進(jìn)行點(diǎn)播回放時(shí)的同步參考信息蜕琴,不是必須 Box。
3.2.4 trun
Track Fragment Run Box宵溅,存儲(chǔ)該 moof 里面相關(guān)的 sample 內(nèi)容凌简。例如,每個(gè) sample 的 size恃逻、 duration雏搂、offset等。
4 fMP4 優(yōu)勢(shì)
4.1 Trick-play
實(shí)現(xiàn) Trick-play(快進(jìn)寇损、快退凸郑、慢動(dòng)作等)支持,需要快速找到播放流中的關(guān)鍵幀矛市,依據(jù) fMP4 的特征芙沥,保證每個(gè)分片以 IDR 幀開(kāi)始的,這就使得上述的方案實(shí)現(xiàn)非常簡(jiǎn)單浊吏。相對(duì) TS 流時(shí)而昨,沒(méi)有辦法保證關(guān)鍵幀的所在位置,需要解析多個(gè) TS Packets 才能找到關(guān)鍵幀的位置找田,fMP4 具體更快的優(yōu)勢(shì)歌憨。
4.2 無(wú)縫碼流切換
無(wú)縫碼流切換的關(guān)鍵在于:當(dāng)?shù)谝粋€(gè)碼流播放結(jié)束時(shí),也就是發(fā)生切換的時(shí)間墩衙,第二個(gè)碼流一定要以關(guān)鍵幀開(kāi)始播放务嫡。
比如 TS 流因?yàn)椴荒鼙WC每個(gè) chunk 一定以關(guān)鍵幀開(kāi)始,碼流切換需要同時(shí)下載兩個(gè)碼流的相應(yīng)分片漆改,并同時(shí)解析兩個(gè)碼流心铃,找到關(guān)鍵幀對(duì)應(yīng)的位置才能切換。如果網(wǎng)絡(luò)不好時(shí)挫剑,切換低碼流時(shí)同時(shí)下載兩個(gè)碼流去扣,會(huì)使卡頓變得更加明顯。
fMP4中暮顺,保證每個(gè)分片以 IDR 幀開(kāi)始的厅篓,還保證不同碼流的分片在時(shí)間線上是對(duì)齊的秀存。而且 fMP4 流音頻視頻數(shù)據(jù)分開(kāi)存儲(chǔ)捶码,視頻和音頻的同步點(diǎn)可以不一樣羽氮,視頻可以以 GOP 邊界作為同步點(diǎn),音頻可以以 sync frame 作為同步點(diǎn)惫恼,使得無(wú)縫碼流切換更簡(jiǎn)單档押。無(wú)縫碼流切換流程參看下圖:
5 fMP4 與 CMAF
CMAF(Common Media Application Format)是由 Microsoft、Apple祈纯、MLBAM令宿、Akamai 等多媒體行業(yè)巨頭向 MPEG 提出并于 2017 年獲批準(zhǔn)的國(guó)際標(biāo)準(zhǔn)。旨在解決媒體擴(kuò)展性腕窥、傳輸?shù)脱舆t粒没、內(nèi)容可緩存性等通用問(wèn)題的綜合性解決方案,降低流媒體傳輸?shù)某杀疽约疤嵘脩趔w驗(yàn)簇爆。
相對(duì) fMP4癞松,需要下載整個(gè)片段才能播放。使用 CMAF 的分塊編碼入蛆,加載到第一個(gè)分塊即可播放响蓉,可以邊下邊播放,因此可實(shí)現(xiàn)更低時(shí)延的傳輸哨毁。
它們的本質(zhì)區(qū)別是:fMP4 是切片文件流枫甲,CMAF 則是連續(xù)流。