以下容器格式的流可以直接由 ExoPlayer 播放。包含的音频和视频样本格式也必须受支持(详情请参阅样本格式部分)。关于图像容器和格式的支持,请参阅图像。
| 容器格式 | 受支持 | 注释 |
|---|---|---|
| MP4 | YES | |
| M4A | YES | |
| FMP4 | YES | |
| WebM | YES | |
| Matroska | YES | |
| MP3 | YES | 某些流仅支持使用恒定比特率寻址进行跳转** |
| Ogg | YES | 包含 Vorbis、Opus 和 FLAC |
| WAV | YES | |
| MPEG-TS | YES | |
| MPEG-PS | YES | |
| FLV | YES | 不支持跳转* |
| ADTS (AAC) | YES | 仅支持使用恒定比特率寻址进行跳转** |
| FLAC | YES | 使用 FLAC 库 或 ExoPlayer 库中的 FLAC 提取器*** |
| AMR | YES | 仅支持使用恒定比特率寻址进行跳转** |
* 不支持跳转,因为容器不提供元数据(例如样本索引),无法让媒体播放器以高效的方式执行跳转。如果需要跳转功能,建议使用更合适的容器格式。
** 这些提取器具有 FLAG_ENABLE_CONSTANT_BITRATE_SEEKING 标志,用于通过恒定比特率假设实现近似跳转。此功能默认不开启。为所有支持它的提取器启用此功能的最简单方法是使用 DefaultExtractorsFactory.setConstantBitrateSeekingEnabled,如此处所述。
*** FLAC 库提取器输出原始音频,可在所有 API 级别由框架处理。ExoPlayer 库的 FLAC 提取器输出 FLAC 音频帧,因此依赖于 FLAC 解码器(例如,处理 FLAC 的 MediaCodec 解码器(API 27 及以上级别要求),或启用了 FLAC 的 FFmpeg 库)。如果应用程序是使用 FLAC 库构建的,DefaultExtractorsFactory 会使用扩展提取器;否则,它会使用 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 为您提供了多种方式来根据应用需求定制播放体验。有关示例,请参阅自定义页面。