播放器就是一個轉換裝置,輸入的是媒體數(shù)據(jù),輸出的是我們可以感知的聲音和畫面。
在ExoPlayer體系中蜘拉,MediaSource就是給播放器提供媒體數(shù)據(jù)的供應商(或者叫供給站)。
播放器工作時候有鹿,會從MediaSource中獲取當前需要播放的媒體片段-MediaPeriod。
MediaPeriod是ExoPlayer中可以獨立播放的媒體數(shù)據(jù)片段谎脯,對于本地媒體文件葱跋,MediaPeriod時間長度一般較長,甚至覆蓋了整個媒體文件;對于流媒體MediaPeriod娱俺,一般較短稍味,在2s-12s左右。
一個MediaPeriod至少包含一個SampleStream(樣本流)荠卷,樣本流是音視頻數(shù)據(jù)的基本單元模庐,指一段連續(xù)的音頻或者視頻數(shù)據(jù),一個視頻的MediaPeriod至少包含兩個SampleStream油宜,音頻至少一個(多種音效)掂碱,視頻一個。
播放流媒體時候慎冤,MediaSource就像一個發(fā)牌器疼燥,它源源不斷的向播放器發(fā)牌(數(shù)據(jù)片段),播放器拿到就把該牌展示出來蚁堤。
現(xiàn)在多媒體播放形式越來較豐富醉者,比如特定時間點插入廣告,用戶拖到特定時間開始播放(seek)披诗,這就要求我們的發(fā)牌器有能夠隨時插入牌和切牌的能力撬即。
面對越來越復雜的發(fā)牌要求,Timeline(時序線)出現(xiàn)了呈队,它是MediaSource中記錄發(fā)牌順序的數(shù)據(jù)結構剥槐,當然包含了著當前需要發(fā)的那一張牌的Id。
MediaSource每次發(fā)牌的時候掂咒,會詢問Timeline該發(fā)哪一張了才沧,Timeline給出一個牌的Id,MediaSource就根據(jù)這個Id绍刮,去本地緩存或者網(wǎng)絡上獲取這張牌并把它發(fā)給播放器温圆。
Timeline表示了MediaSource的順序結構,當MediaSource數(shù)據(jù)結構改變的時候孩革,Timeline也會隨著改變岁歉。
那Timeline是如何知道一個媒體源的發(fā)牌順序呢?
這就是流媒體協(xié)議的定義了膝蜈,流媒體把一個音視頻切片成一個個小的片段锅移,并給這些小的片段按順序編上Id,然后把這個Id范圍和順序結構放到流媒體的媒體描述信息部分饱搏,TimeLine的實現(xiàn)類就是通過解析流媒體協(xié)議(Hls非剃、dash)的協(xié)議這部信息得到媒體播放順序的。
小結
如上圖MediaSource就是給播放器的媒體數(shù)據(jù)供應商推沸,它包含了兩個重要的功能機構:
- 發(fā)牌決策機構-timeline:它根據(jù)流媒體媒體描述信息和人工的數(shù)據(jù)干預來制定好媒體片段的發(fā)送順序备绽;
- 發(fā)牌流水線:根據(jù)決策結構提供的Id券坞,來獲取需要的媒體數(shù)據(jù)片段MediaPeriod,并把獲取到的數(shù)據(jù)交給播放器播放肺素。