mp4相比m3u8第一幀加載較慢的原因?
工作室正在做的軟件,是一個以長視頻播放為主的Android與IOS 手機軟件。
最近半年,老板要求對視頻的 秒開率(1秒內成功加載的播放數 / 播放總數)、失敗率 (播放失敗的次數 / 播放總數) 等進行優化。經過線上AB測試發現,m3u8視頻(第一段切片為1~3秒)
在秒開率、失敗率等性能指標上均優於普通mp4視頻
。
這里想探究一下,m3u8視頻(第一段切片為1~3秒)
在秒開率上均優於普通mp4視頻
的原因。
網絡上找到的原因基本是:
mp4 - PC/Apple/Android 通吃,和HTML5和flash播放器親和度都挺好,但是文件頭太大,結構復雜,長視頻的大文件頭影響加載速度的視頻體驗, 所以短視頻更常見
一、普通MP4
這里從網絡上找了一個普通MP4文件的結構圖,讓我們看一下它的文件結構:
一眼看去,完全懵逼了,果然結構復雜...
MP4實際代表的含義是 MPEG-4 Part 14。
其文件由若干個box
組成,每個box
有類型和長度,這里可以將box
理解為一個數據對象塊。box
中還可以包含子box
,包含子 box 則稱之為container box
。
這里我從網絡上下載了一個普通MP4文件。在Mac平台上,我們用MediaParser軟件可以用來大致看一下這個MP4文件的構造。
1.1、ftyp
一個MP4文件有且只有一個 ftyp
,在MP4文件的開始位置,描述的文件的版本、兼容協議等 ;
1.2、moov
moov(Movie Box)是一個container box
,一般跟隨在ftyp之后,有且只有一個。
其不包含具體媒體數據,但包含本文件中所有媒體數據的宏觀描述信息(視頻創建時間、視頻修改時間、播放速率、視頻時長、音量大小、視頻寬高、字幕語言、聲道、視頻/音頻幀位置 等)。
moov box下,一般包含以下幾個box:
- mvhd 中記錄了創建時間、修改時間、時間度量標尺、可播放時長等信息;
- trak 可以有多個,描述了每個媒體軌道的具體信息;
- udta user data;
1.3、mdat
mdat(Midia Data Box)MP4文件的媒體數據存放在這里。mdat中的數據幀依次存放,每個幀的位置、時間、長度都由moov中的信息指定。
mdat Box 基本上占據了視頻大小的 95% 以上,得益於 mp4 邊下邊播的效果,瀏覽器獲取到了部分 mdat box,就可以進行播放。
若希望詳細了解普通MP4文件結構,可參考文章:
mp4文件格式解析
結論
了解到此,大致可以了解到:
普通MP4文件播放時,ftyp與moov box需同時加載完成后,並下載部分mdat box的幀數據后,才能開始播放。
那對於一些長視頻,確實存在文件頭過大,從而影響第一幀的加載速度問題。
另外,對於不是很規范的文件,例 mp4視頻文件舉例
中moov box基本在文件最后的的MP4文件,還有可能存在視頻文件基本下載完成后才能播放的問題。
二、Fragment mp4 (fmp4)
在網絡上查找MP4文件結構時,發現一種Fragmented mp4 的文件結構圖。
fmp4 是基於 MPEG-4 Part 12 的流媒體格式。與普通MP4相比:
- fmp4不需要一個 moov Box 來進行 initialization
- fmp4 的 moov Box 只包含了一些 track 信息
- fmp4 的 視頻/音頻 metadata 信息與數據都存在一個個 moof、mdat 中,它是一個流式的封裝格式
2.1、Fragment
在微軟的 Silverlight中的Smooth Streaming文件結構
文件分為了多個Fragments,每個Fragment中包含moof和mdat。這樣的結構符合漸進式播放需求,mdat及其描述信息逐步傳輸,收齊一個Fragment便可播放其中的mdat
2.2、moof
這個box並不是MP4文件必須的部分。它是視頻分片的描述信息,其為流媒體格式(微軟的 Silverlight中的Smooth Streaming)中的重中之重。
三、參考
什么是「Fragmented mp4(fmp4)」, 它和普通 mp4 格式有什么區別?