DASH (Truyền phát thích ứng động qua HTTP)

ExoPlayer hỗ trợ DASH với nhiều định dạng vùng chứa. Luồng nội dung đa phương tiện phải được tách biệt, nghĩa là video, âm thanh và văn bản phải được xác định trong các phần tử AdaptationSet riêng biệt trong tệp kê khai DASH (CEA-608 là một trường hợp ngoại lệ như mô tả trong bảng dưới đây). Các định dạng mẫu âm thanh và video có trong cũng phải được hỗ trợ (xem phần định dạng mẫu để biết thông tin chi tiết).

Tính năng Có thể làm Bình luận
Vùng chứa
FMP4 NÊN Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp
WebM NÊN Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp
Matroska NÊN Chỉ những sự kiện phát trực tiếp chưa được phát trực tiếp
MPEG-TS KHÔNG NÊN Chưa lên kế hoạch hỗ trợ
Phụ đề
TTML NÊN Thô hoặc nhúng trong FMP4 theo tiêu chuẩn ISO/IEC 14496-30
WebVTT NÊN Thô hoặc nhúng trong FMP4 theo tiêu chuẩn ISO/IEC 14496-30
CEA-608 NÊN Được nhúng trong FMP4 khi được báo hiệu bằng bộ mô tả Hỗ trợ tiếp cận theo chuẩn SCTE
CEA-708 NÊN Được nhúng trong FMP4 khi được báo hiệu bằng bộ mô tả Hỗ trợ tiếp cận theo chuẩn SCTE
Siêu dữ liệu
Siêu dữ liệu EMSG NÊN Được nhúng trong FMP4
Bảo vệ nội dung
Widevine NÊN Lược đồ "cenc": API 19 trở lên; lược đồ "cbcs": API cấp 25 trở lên
PlaySẵn sàng SL2000 NÊN Chỉ dành cho Android TV, giao thức "cenc"
Phím Xóa NÊN Chỉ lược đồ API 21+, "cenc"
Phát trực tiếp
Phát trực tiếp thường xuyên NÊN
Phát trực tiếp CMAF độ trễ thấp nhất NÊN
Dữ liệu ứng dụng nội dung nghe nhìn phổ biến (CMCD) NÊN Hướng dẫn tích hợp

Sử dụng MediaItem

Để phát một luồng DASH, bạn cần phụ thuộc vào mô-đun DASH.

Kotlin

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

Groovy

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

Sau đó, bạn có thể tạo MediaItem cho URI MPD DASH và truyền cho trình phát.

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();

Nếu URI của bạn không kết thúc bằng .mpd, bạn có thể chuyển MimeTypes.APPLICATION_MPD đến setMimeType của MediaItem.Builder để cho biết rõ loại nội dung.

ExoPlayer sẽ tự động điều chỉnh giữa các cách biểu diễn được xác định trong tệp kê khai, có tính đến cả băng thông có sẵn và khả năng của thiết bị.

Sử dụng DashMediaSource

Để có thêm lựa chọn tuỳ chỉnh, bạn có thể tạo DashMediaSource và truyền trực tiếp đến người chơi thay vì 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();

Truy cập vào tệp kê khai

Bạn có thể truy xuất tệp kê khai hiện tại bằng cách gọi Player.getCurrentManifest. Đối với DASH, bạn nên truyền đối tượng được trả về tới DashManifest. Lệnh gọi lại onTimelineChanged của Player.Listener cũng được gọi bất cứ khi nào tệp kê khai được tải. Điều này sẽ xảy ra một lần đối với nội dung theo yêu cầu và có thể nhiều lần đối với nội dung phát trực tiếp. Đoạn mã sau đây cho thấy cách một ứng dụng có thể làm một việc gì đó bất cứ khi nào tệp kê khai được tải.

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.
        }
      }
    });

Tuỳ chỉnh chế độ phát

ExoPlayer cung cấp nhiều cách để bạn điều chỉnh trải nghiệm phát theo nhu cầu của ứng dụng. Xem trang Tuỳ chỉnh để biết các ví dụ.