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 库)。 DefaultExtractorsFactory
如果应用程序使用 FLAC 库 构建,则使用扩展提取器。否则,它使用 ExoPlayer 库 提取器。
使用 MediaItem
要播放渐进式流,请使用媒体 URI 创建 MediaItem
并将其传递给播放器。
Kotlin
// Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(progressiveUri)) // Prepare the player. player.prepare()
Java
// Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media item to be played. player.setMediaItem(MediaItem.fromUri(progressiveUri)); // Prepare the player. player.prepare();
使用 ProgressiveMediaSource
为了获得更多自定义选项,您可以创建 ProgressiveMediaSource
并将其直接传递给播放器,而不是 MediaItem
。
Kotlin
// Create a data source factory. val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory() // Create a progressive media source pointing to a stream uri. val mediaSource: MediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(progressiveUri)) // Create a player instance. val player = ExoPlayer.Builder(context).build() // Set the media source to be played. player.setMediaSource(mediaSource) // Prepare the player. player.prepare()
Java
// Create a data source factory. DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory(); // Create a progressive media source pointing to a stream uri. MediaSource mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(MediaItem.fromUri(progressiveUri)); // Create a player instance. ExoPlayer player = new ExoPlayer.Builder(context).build(); // Set the media source to be played. player.setMediaSource(mediaSource); // Prepare the player. player.prepare();
自定义播放
ExoPlayer 提供多种方法让您根据应用的需要定制播放体验。请参阅 自定义页面 获取示例。