渐进式

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 库提取器。

使用 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 提供多种方法让您根据应用的需求定制播放体验。有关示例,请参阅自定义页面