定義 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 | 是 | 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4 |
WebVTT | 是 | 原始格式,或根據 ISO/IEC 14496-30 嵌入 FMP4 |
CEA-608 | 是 | 使用 SCTE 無障礙描述符發出訊號時,嵌入 FMP4 |
CEA-708 | 是 | 使用 SCTE 無障礙描述符發出訊號時,嵌入 FMP4 |
Metadata | ||
EMSG 中繼資料 | 是 | 嵌入 FMP4 |
內容保護 | ||
Widevine | 是 | 「cenc」配置:API 19 以上版本;「cbcs」配置:API 25 以上版本 |
PlayReady SL2000 | 是 | Android TV,僅限「cenc」配置 |
ClearKey | 是 | API 21 以上版本,僅限「cenc」配置文件 |
即時播放 | ||
一般直播播放 | 是 | |
超低延遲 CMAF 直播播放 | 是 | |
通用媒體用戶端資料 (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 | 是 | API 19 以上版本 (使用「cenc」配置) 和 25 以上版本 (使用「cbcs」配置) |
PlayReady SL2000 | 是 | 僅 Android TV |
伺服器控制 | ||
差異更新 | 是 | |
封鎖播放清單重新載入 | 是 | |
封鎖預先載入提示的載入作業 | 是 | 不含長度未定義的位元組範圍 |
即時播放 | ||
一般直播播放 | 是 | |
低延遲 HLS (Apple) | 是 | |
低延遲 HLS (社群) | 否 | |
通用媒體用戶端資料 (CMCD) | 是 | 整合指南 |
漸進式容器格式
ExoPlayer 可直接播放下列容器格式的串流。系統也必須支援其中的音訊和視訊樣本格式 (詳情請參閱「樣本格式」一節)。如需圖片容器和格式支援資訊,請參閱「圖片」。
容器格式 | 支援 | 留言 |
---|---|---|
MP4 | 是 | |
M4A | 是 | |
FMP4 | 是 | |
WebM | 是 | |
Matroska | 是 | |
MP3 | 是 | 部分串流只能使用固定比特率尋找功能進行尋找** |
Ogg | 是 | 包含 Vorbis、Opus 和 FLAC |
WAV | 是 | |
MPEG-TS | 是 | |
MPEG-PS | 是 | |
FLV | 是 | 無法跳轉* |
ADTS (AAC) | 是 | 僅可使用固定比特率尋找功能進行尋找** |
FLAC | 是 | 使用 ExoPlayer 程式庫中的 FLAC 程式庫或 FLAC Extractor*** |
AMR | 是 | 僅可使用固定比特率尋找功能進行尋找** |
* 系統不支援尋找功能,因為容器未提供中繼資料 (例如樣本索引),無法讓媒體播放器以有效率的方式執行尋找作業。如果需要尋找功能,建議使用更合適的容器格式。
** 這些擷取工具具有 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING
旗標,可使用固定的比特率假設啟用近似搜尋功能。這項功能預設為停用。如要為所有支援這項功能的擷取器啟用這項功能,最簡單的方法就是使用 DefaultExtractorsFactory.setConstantBitrateSeekingEnabled
,如這裡所述。
*** FLAC 程式庫擷取器會輸出原始音訊,可由所有 API 級別的架構處理。ExoPlayer 程式庫 FLAC Extractor 會輸出 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 的 RTP。
格式範例
根據預設,ExoPlayer 會使用 Android 的平台解碼器。因此,支援的樣本格式取決於基礎平台,而非 ExoPlayer。如要查看 Android 裝置支援的範例格式說明文件,請參閱「支援的媒體格式」。請注意,個別裝置可能支援上述以外的其他格式。
除了 Android 的平台解碼器之外,ExoPlayer 也可以使用軟體解碼器擴充功能。這些檔案必須手動建構,並納入希望使用這些檔案的專案中。我們目前提供 AV1、VP9、FLAC、Opus、FFmpeg、MIDI 和 IAMF 的軟體解碼器程式庫。
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 |
AC-3 | ac3 |
E-AC-3 | eac3 |
DTS、DTS-HD | dca |
TrueHD | mlp truehd |
圖片
ExoPlayer 支援下列圖片格式。如要瞭解如何整合可能支援不同格式的外部程式庫,請參閱「圖片載入程式庫」。
圖片格式 | 支援 | 附註 |
---|---|---|
BMP | 是 | |
GIF | 否 | 不支援 Extractor |
JPEG | 是 | |
JPEG 動態相片 | 是 | 支援靜態影像和影片 |
JPEG Ultra HDR | 是 | 在 Android 14 之前或非 HDR 螢幕上,會改用 SDR |
PNG | 是 | |
WebP | 是 | |
HEIF/HEIC | 是 | |
HEIC 動態相片 | 不盡然 | 僅支援靜態圖片* |
AVIF (基準) | 是 | 僅在 Android 14 以上版本解碼 |
* 您可以使用 MetadataRetriever 取得 HEIC 動態相片的影片部分,並以獨立檔案播放。
獨立字幕格式
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 解碼/顯示功能,以及 HDR 在各 Android 版本的支援情形。
播放 HDR 串流時,如果需要支援特定編解碼設定檔,ExoPlayer 的預設 MediaCodec
選擇器會選取支援該設定檔的解碼器 (如有),即使同樣 MIME 類型的另一個解碼器不支援該設定檔,但在編解碼器清單中排序較前,也一樣。因此,如果串流超出相同 MIME 類型的硬體解碼器功能,就會選取軟體解碼器。