支持的格式

定义 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 Accessibility 描述符进行标记时嵌入在 FMP4 中
CEA-708 使用 SCTE Accessibility 描述符进行标记时嵌入在 FMP4 中
元数据
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
元数据
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 使用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 还可以使用软件解码器扩展。这些必须手动构建并包含在希望使用它们的项目中。我们目前提供用于AV1VP9FLACOpusFFmpeg的软件解码器库。

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 超高清 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

HDR 视频播放

ExoPlayer 处理各种容器中的高动态范围 (HDR) 视频提取,包括 MP4 中的 Dolby Vision 和 Matroska/WebM 中的 HDR10+。HDR 内容的解码和显示取决于 Android 平台和设备的支持。请参阅HDR 视频播放,了解如何检查 HDR 解码/显示功能以及跨 Android 版本的 HDR 支持的限制。

播放需要特定编解码器配置文件支持的 HDR 流时,ExoPlayer 的默认MediaCodec 选择器将选择支持该配置文件的解码器(如果可用),即使另一个不支持该配置文件的相同 MIME 类型的解码器出现在编解码器列表的更上方。这可能会导致在流超过相同 MIME 类型的硬件解码器功能的情况下选择软件解码器。