支援的格式

定義 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 也可以使用軟體解碼器擴充功能。這些檔案必須手動建構,並納入希望使用這些檔案的專案中。我們目前提供 AV1VP9FLACOpusFFmpegMIDIIAMF 的軟體解碼器程式庫。

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 類型的硬體解碼器功能,就會選取軟體解碼器。