ExoPlayer 源碼分析 二 類圖 & 名詞解釋

ExoPlayer 源碼分析 一 HLS 拉流及播放流程
ExoPlayer 源碼分析 二 類圖 & 名詞解釋
ExoPlayer 源碼分析 三 變速播放
ExoPlayer 源碼分析 四 緩存策略
ExoPlayer 源碼分析 五 碼率自適應

本文基于 ExoPlayer 2.13.2 。

線程相關

圖一
LoadTask

LoadTask 實現(xiàn)了 Runnable 接口,而且同時繼承了 Handler ,它有三個作用:

  • 通過 Loadable 加載數(shù)據(jù)—— run 方法中調用 Loadable 的 load 方法。
  • load 完成之后通過 handler 通知 callback。
  • 加載過程中如有異常發(fā)生,通知 callback。
Loadable

真正執(zhí)行加載工作的類,它的兩個實現(xiàn)后續(xù)再分析。

Loader

Loader 中有個線程池,當有工作要做的時候它會創(chuàng)建一個 LoadTask 丟進線程池中之行。

配置文件

HLS

圖二
HlsMediaPlaylist

HlsMediaPlaylist 可以簡單理解為一路可播放的流,其中的 Segment 表示這一路流被切成小的分段,播放時 Segment 按順序加載。

HlsMasterPlayList

Alternate Media 支持多種碼率或多種語言的流,這時候就需要多級目錄,HlsMasterPlayList 可以看作是一級目錄,其中的每個 Variant 解析出來又是 HlsMediaPlaylist。

DASH

圖三

這個類圖各個組件很好的對應了 MPD 文件:

圖四
MediaPresentationDescription(MPD)

MPD 是一種分層數(shù)據(jù)文件,用 xml 表示,一個 MPD 描述了視頻的所有信息,一個 MPD 包含一個或多個 Period。

Period

每個 Period 代表一個時間段,同一個時間段內(nèi),可用的媒體內(nèi)容以及碼率不會變更。如果是直播可能需要周期的去服務器更新 MPD 文件,服務器可能會移除舊的已經(jīng)過時的Period,或是添加新的Period。新的Period中可能會添加新的可用碼率或去掉上一個Period中存在的某些碼率。

AdaptationSet

一個 Period 由一個或多個 AdaptationSet 組成,AdaptationSet 由一組可供切換不同碼率的流組成。

Representation

每個 Adaptationset 包含了一個或者多個Representations.

Segment

每個Representation由一個或者多個segment組成 ;

DataSource

圖五
DataSource

DataSource 負責提供媒體數(shù)據(jù),DefaultHttpDataSource 等就是它不同形式的實現(xiàn),這個比較好理解就不一一解釋了。

Chunk

圖六
Chunk

Chunk 實現(xiàn)了 Loadable 接口,它可以放入線程中執(zhí)行,用于加載數(shù)據(jù)。Hls 和 DASH 都是分段加載的,一個 Chunk 的子類負責加載一個 Segment 的數(shù)據(jù)(這里不確定 Chunk 和 Segment 的關系是否一對一,有時間再詳細分析)。

TsChunk

用于加載 Hls 中的 MPEG2TS 塊。

MediaPlaylistChunk

處理 Hls 配置文件的 chunk。

SingleSampleMediaChunk

VTT 等字幕文件是不需要分塊加載的,可以一次性加載完,SingleSampleMediaChunk 用于處理這種情況。

ContainerMediaChunk

DASH 和 SmoothStreaming 都是用它加載和解析分段的多媒體數(shù)據(jù)。

Extractor

圖七
Extractor

顧名思義就是內(nèi)容提取器,從原始數(shù)據(jù)流中提取出音頻、視頻、字幕等內(nèi)容。具體提取方式由子類實現(xiàn)。比如 TsExtractor 構造了一系列 PayLoadReader,通過他們實現(xiàn),而 Mp4Extractor 則是自己實現(xiàn)。

ExtractorInput

提供數(shù)據(jù)供 Extractor 消費,它的默認實現(xiàn)是 DefaultExtractorInput 數(shù)據(jù)源是 DataSource。

ExtractorOutput

接收 Extractor 提取的流級數(shù)據(jù)。

TrackOutput

接收由 Extractor 提取的數(shù)據(jù),它的默認實現(xiàn)是 DefaultTrackOut,它內(nèi)部通過 RollingSampleBuffer 存儲數(shù)據(jù)。

RollingSampleBuffer

樣本數(shù)據(jù)和相應樣本信息的滾動緩沖區(qū),存儲數(shù)據(jù)的容器是阻塞的雙端隊列,RollingSampleBuffer 將它封裝成滾動的形式。

ChunkSource

圖八
ChunkSource

用于構建并提供 Chunk 對象,上面說過 Chunk 是一種 Loadable ,它負責從網(wǎng)絡、file 等加載數(shù)據(jù)。HlsChunkSource 并未實現(xiàn) ChunkSource 接口。

SampleSource

圖九
SampleHolder

Extractor 提取后的數(shù)據(jù)存儲在 RollingSampleBuffer 中,這里的數(shù)據(jù)比如一個 nal unit 就稱為 Sample。SampleHolder 里有一個 buffer 用于暫存 Sample 數(shù)據(jù)供解碼器使用。

SampleSource

為解碼器提供 Sample 數(shù)據(jù)。

SampleSourceReader

從 RollingSampleBuffer 讀取 Sample 數(shù)據(jù)。

Render
圖十

Renderer 的子類并不只負責渲染,而是負責讀取 Sample、解碼、渲染這三個行為,Renderer 通過繼承將公共的行為抽象出來。比如 SampleSourceTrackRenderer 負責從 RollingSampleBuffer 中讀取數(shù)據(jù),MediaCodecTrackRenderer 負責初始化 MediaCodec 并將數(shù)據(jù)寫入 MediaCodec 的 inputBuffer 中。而
MediaCodecAudioTrackRenderer 中則創(chuàng)建了 AudioTrack 負責音頻輸出。

Hls 相關類圖

圖十一
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容