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 中
元数据
EMSG 元数据 嵌入在 FMP4 中
内容保护
Widevine “cenc”方案:API 19 及更高版本;“cbcs”方案:API 25 及更高版本
PlayReady SL2000 Android TV,仅限“cenc”方案
ClearKey API 21 及更高级别,仅限“cenc”方案
广告插播
多时段播放
服务器引导型广告插入 (xlinks)
IMA 服务器端和客户端广告 广告插播指南
实时播放
常规直播播放
超低延迟 CMAF 直播播放
通用媒体客户端数据(CMCD) CMCD 集成指南

使用 MediaItem

如需播放 DASH 串流,您需要依赖于 DASH 模块。

Kotlin

implementation("androidx.media3:media3-exoplayer-dash:1.6.0")

Groovy

implementation "androidx.media3:media3-exoplayer-dash:1.6.0"

然后,您可以为 DASH MPD URI 创建 MediaItem,并将其传递给播放器。

Kotlin

// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the media item to be played.
player.setMediaItem(MediaItem.fromUri(dashUri))
// 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(dashUri));
// Prepare the player.
player.prepare();

如果您的 URI 不以 .mpd 结尾,您可以将 MimeTypes.APPLICATION_MPD 传递给 MediaItem.BuildersetMimeType,以明确指明内容类型。

ExoPlayer 会自动在清单中定义的表示法之间进行调整,同时考虑可用带宽和设备功能。

使用 DashMediaSource

如需更多自定义选项,您可以创建 DashMediaSource 并将其直接传递给播放器,而不是 MediaItem

Kotlin

val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a dash media source pointing to a dash manifest uri.
val mediaSource: MediaSource =
  DashMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(dashUri))
// Create a player instance which gets an adaptive track selector by default.
val player = ExoPlayer.Builder(context).build()
// Set the media source to be played.
player.setMediaSource(mediaSource)
// Prepare the player.
player.prepare()

Java

DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a dash media source pointing to a dash manifest uri.
MediaSource mediaSource =
    new DashMediaSource.Factory(dataSourceFactory)
        .createMediaSource(MediaItem.fromUri(dashUri));
// Create a player instance which gets an adaptive track selector by default.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the media source to be played.
player.setMediaSource(mediaSource);
// Prepare the player.
player.prepare();

访问清单

您可以通过调用 Player.getCurrentManifest 检索当前清单。对于 DASH,您应将返回的对象转换为 DashManifest。每当加载清单时,系统也会调用 Player.ListeneronTimelineChanged 回调。对于点播内容,这将发生一次;对于直播内容,则可能会发生多次。以下代码段展示了应用如何在每次加载清单时执行操作。

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTimelineChanged(timeline: Timeline, @TimelineChangeReason reason: Int) {
      val manifest = player.currentManifest
      if (manifest is DashManifest) {
        // Do something with the manifest.
      }
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTimelineChanged(
          Timeline timeline, @Player.TimelineChangeReason int reason) {
        Object manifest = player.getCurrentManifest();
        if (manifest != null) {
          DashManifest dashManifest = (DashManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

自定义播放

ExoPlayer 提供了多种方法,可让您根据应用的需求量身定制播放体验。如需查看示例,请参阅“自定义”页面