定義 ExoPlayer 支援的格式時,請務必注意「媒體格式」是在多個層級定義。以下列出最低到最高的層級:
- 個別媒體樣本的格式 (例如影片影格或音訊影格)。這些是範例格式。請注意,一般影片檔案至少會包含兩種樣本格式的媒體:一種是影片 (例如 H.264),另一種是音訊 (例如 AAC)。
- 容器的格式,用於存放媒體樣本和相關聯的中繼資料。這些是容器格式。媒體檔案具有單一容器格式 (例如 MP4),通常以副檔名表示。請注意,對於部分純音訊格式 (例如 MP3),樣本和容器格式可能相同。
- 自動調整串流技術,例如 DASH、SmoothStreaming 和 HLS。這些並非媒體格式,但仍須定義 ExoPlayer 提供的支援層級。
以下各節會定義 ExoPlayer 在各層級的支援情形,從最高層級到最低層級。最後兩節說明支援的獨立字幕格式和 HDR 影片播放功能。
自動調整串流
DASH
ExoPlayer 支援 DASH,並提供多種容器格式。媒體串流必須經過多工解訊,也就是說,影片、音訊和文字必須在 DASH 資訊清單中以不同的 AdaptationSet 元素定義 (CEA-608 是例外狀況,如下表所述)。內含的音訊和視訊樣本格式也必須支援 (詳情請參閱「樣本格式」一節)。
| 功能 | 支援 | 留言 |
|---|---|---|
| 容器 | ||
| FMP4 | 是 | 僅限解多工串流 |
| WebM | 是 | 僅限解多工串流 |
| Matroska | 是 | 僅限解多工串流 |
| MPEG-TS | 否 | 不支援 |
| 隱藏式輔助字幕 / 字幕 | ||
| TTML | YES | 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4 |
| WebVTT | YES | 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4 |
| CEA-608 | YES | 在以 SCTE 無障礙描述元發出信號時,嵌入 FMP4 中 |
| CEA-708 | YES | 在以 SCTE 無障礙描述元發出信號時,嵌入 FMP4 中 |
| Metadata | ||
| EMSG 中繼資料 | 是 | 內嵌於 FMP4 |
| 內容保護 | ||
| Widevine | YES | 「cenc」架構:API 19 以上版本; 「cbcs」架構:API 25 以上版本 |
| PlayReady SL2000 | 是 | Android TV,僅限「cenc」方案 |
| ClearKey | 是 | API 21 以上版本,僅限「cenc」架構 |
| 廣告插播 | ||
| 多時段播放 | 是 | |
| 伺服器導向廣告插入 (xlinks) | 否 | |
| IMA 伺服器端和用戶端廣告 | YES | 廣告插播指南 |
| 即時回放 | ||
| 一般直播播放 | 是 | |
| 超低延遲 CMAF 直播播放 | YES | |
| 通用媒體用戶端資料 (CMCD) | YES | CMCD 整合指南 |
SmoothStreaming
ExoPlayer 支援 FMP4 容器格式的 SmoothStreaming。媒體串流必須經過解多工處理,也就是說,影片、音訊和文字必須在 SmoothStreaming 資訊清單中,以不同的 StreamIndex 元素定義。內含的音訊和影片樣本格式也必須支援 (詳情請參閱「樣本格式」一節)。
| 功能 | 支援 | 留言 |
|---|---|---|
| 容器 | ||
| FMP4 | 是 | 僅限解多工串流 |
| 隱藏式輔助字幕/字幕 | ||
| TTML | 是 | 內嵌於 FMP4 |
| 內容保護 | ||
| PlayReady SL2000 | 是 | 僅 Android TV |
| 即時回放 | ||
| 一般直播播放 | 是 | |
| 通用媒體用戶端資料 (CMCD) | 是 | 整合指南 |
HLS
ExoPlayer 支援 HLS,並提供多種容器格式。內含的音訊和影片樣本格式也必須受到支援 (詳情請參閱「樣本格式」一節)。我們強烈建議 HLS 內容製作人產生高品質的 HLS 串流,詳情請參閱這篇網誌文章。
| 功能 | 支援 | 留言 |
|---|---|---|
| 容器 | ||
| MPEG-TS | 是 | |
| FMP4/CMAF | 是 | |
| ADTS (AAC) | 是 | |
| MP3 | 是 | |
| 隱藏式輔助字幕 / 字幕 | ||
| CEA-608 | 是 | |
| CEA-708 | 是 | |
| WebVTT | 是 | |
| Metadata | ||
| ID3 | 是 | |
| SCTE-35 | 否 | |
| 內容保護 | ||
| AES-128 | 是 | |
| AES-128 範例 | 否 | |
| Widevine | YES | API 19 以上 (「cenc」架構) 和 25 以上 (「cbcs」架構) |
| PlayReady SL2000 | 是 | 僅 Android TV |
| 伺服器控制 | ||
| 差異更新 | 是 | |
| 封鎖播放清單重新載入 | 是 | |
| 封鎖預先載入提示的載入作業 | YES | 長度未定義的位元組範圍除外 |
| 廣告插播 | ||
| 伺服器導向廣告插入 (插頁式廣告) | 部分 | 僅限 VOD,且必須有 X-ASSET-URI。
直播和X-ASSET-LIST將於日後新增。 |
| IMA 伺服器端和用戶端廣告 | YES | 廣告插播指南 |
| 即時回放 | ||
| 一般直播播放 | 是 | |
| 低延遲 HTTP 即時串流 (Apple) | 是 | |
| 低延遲 HTTP 即時串流 (社群) | 否 | |
| 通用媒體用戶端資料 CMCD | YES | CMCD 整合指南 |
漸進式容器格式
ExoPlayer 可以直接播放下列容器格式的串流。 內含的音訊和視訊樣本格式也必須受到支援 (詳情請參閱「樣本格式」一節)。如要瞭解圖片容器和格式支援情形,請參閱「圖片」。
| 容器格式 | 支援 | 留言 |
|---|---|---|
| MP4 | 是 | |
| M4A | 是 | |
| FMP4 | 是 | |
| WebM | 是 | |
| Matroska | 是 | |
| MP3 | 是 | 部分串流只能使用固定位元率搜尋** |
| Ogg | 是 | 包含 Vorbis、Opus 和 FLAC |
| WAV | 是 | |
| MPEG-TS | 是 | |
| MPEG-PS | 是 | |
| FLV | 是 | 無法搜尋* |
| ADTS (AAC) | 是 | 只能使用固定位元率搜尋** |
| FLAC | 是 | 使用 FLAC 程式庫或 ExoPlayer 程式庫中的 FLAC 擷取器*** |
| AMR | 是 | 只能使用固定位元率搜尋** |
* 容器未提供中繼資料 (例如樣本索引),因此媒體播放器無法有效率地執行搜尋,導致系統不支援搜尋。如果需要搜尋,建議使用更合適的容器格式。
** 這些擷取器有 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 標記,可啟用使用固定位元率假設的近似搜尋功能。這項功能預設為停用。如要為所有支援這項功能的擷取器啟用這項功能,最簡單的方法是使用 DefaultExtractorsFactory.setConstantBitrateSeekingEnabled,如這裡所述。
*** FLAC 程式庫擷取器會輸出原始音訊,架構可在所有 API 級別處理這類音訊。ExoPlayer 程式庫 FLAC 擷取器會輸出 FLAC 音訊影格,因此必須有 FLAC 解碼器 (例如處理 FLAC 的 MediaCodec 解碼器 (API 級別 27 以上版本必須具備),或是啟用 FLAC 的 FFmpeg 程式庫)。如果應用程式是使用 FLAC 程式庫建構,DefaultExtractorsFactory 會使用擴充功能擷取器。否則會使用 ExoPlayer 程式庫擷取器。
RTSP
ExoPlayer 支援即時和隨選 RTSP。支援的樣本格式和網路類型如下。
支援的樣本格式
- H264 (SDP 媒體說明必須在 fmtp 屬性中包含 SPS/PPS 資料,以初始化解碼器)。
- AAC (含 ADTS 位元串流)。
- AC3。
支援的網路類型
- 透過 UDP 單點傳播的 RTP (不支援多點傳播)。
- 交錯式 RTSP,透過 TCP 使用 RTSP 的 RTP。
範例格式
根據預設,ExoPlayer 會使用 Android 平台解碼器。因此,支援的樣本格式取決於基礎平台,而非 ExoPlayer。如需 Android 裝置支援的範例格式說明文件,請參閱「支援的媒體格式」。請注意,個別裝置可能支援其他格式。
除了 Android 平台解碼器,ExoPlayer 也能使用軟體解碼器擴充功能。這些項目必須手動建構,並納入要使用這些項目的專案。我們目前提供 AV1、VP9、FLAC、Opus、FFmpeg、MIDI、IAMF 和 MPEG-H 的軟體解碼器程式庫。
FFmpeg 程式庫
FFmpeg 程式庫支援解碼各種不同的音訊樣本格式。建構程式庫時,您可以選擇要加入哪些解碼器,詳情請參閱程式庫的 README.md。下表列出音訊樣本格式與對應 FFmpeg 解碼器名稱的對應關係。
| 範例格式 | 解碼器名稱 |
|---|---|
| Vorbis | vorbis |
| Opus | opus |
| FLAC | flac |
| ALAC | alac |
| PCM μ-law | pcm_mulaw |
| PCM A-law | pcm_alaw |
| MP1、MP2、MP3 | MP3 |
| AMR-NB | amrnb |
| AMR-WB | amrwb |
| AAC | aac |
| AC-3 | ac3 |
| E-AC-3 | eac3 |
| DTS、DTS-HD | dca |
| TrueHD | mlp truehd |
圖片
ExoPlayer 支援下列圖片格式。如要與可能支援不同格式集的外部程式庫整合,請參閱「圖片載入程式庫」。
| 圖片格式 | 支援 | 附註 |
|---|---|---|
| BMP | 是 | |
| GIF | 否 | 不支援擷取器 |
| JPEG | 是 | |
| JPEG 動態相片 | 是 | 支援靜態圖片和影片 |
| JPEG Ultra HDR | YES | 在 Android 14 之前的版本或非 HDR 螢幕上,會改用 SDR |
| PNG | 是 | |
| WebP | 是 | |
| HEIF/HEIC | 是 | |
| HEIC 動態相片 | 是 | |
| AVIF (基準) | 是 | 僅限 Android 14 以上版本解碼 |
獨立字幕格式
ExoPlayer 支援各種格式的獨立字幕檔。如要側載字幕檔,請參閱媒體項目頁面的說明。
| 容器格式 | 支援 | MIME 類型 |
|---|---|---|
| WebVTT | 是 | MimeTypes.TEXT_VTT |
| TTML / SMPTE-TT | 是 | MimeTypes.APPLICATION_TTML |
| SubRip | 是 | MimeTypes.APPLICATION_SUBRIP |
| SubStationAlpha (SSA/ASS) | 是 | MimeTypes.TEXT_SSA |
高動態範圍影片播放
ExoPlayer 會處理各種容器中的高動態範圍 (HDR) 影片,包括 MP4 中的 Dolby Vision 和 Matroska/WebM 中的 HDR10+。解碼及顯示 HDR 內容取決於 Android 平台和裝置是否支援。請參閱「HDR 影片播放」,瞭解如何檢查 HDR 解碼/顯示功能,以及各 Android 版本 HDR 支援的限制。
播放需要特定轉碼器設定檔支援的 HDR 串流時,即使相同 MIME 類型中不支援該設定檔的其他解碼器在轉碼器清單中排序較高,ExoPlayer 的預設 MediaCodec 選擇器仍會選擇支援該設定檔的解碼器 (如有)。如果串流超出相同 MIME 類型硬體解碼器的功能範圍,系統可能會選取軟體解碼器。