HLS (Phát trực tuyến dựa trên HTTP)

ExoPlayer hỗ trợ HLS với nhiều định dạng vùng chứa. 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). Chúng tôi đặc biệt khuyến khích các nhà sản xuất nội dung HLS tạo luồng HLS chất lượng cao, như mô tả tại đây.

Tính năng Có thể làm Bình luận
Vùng chứa
MPEG-TS NÊN
FMP4/CMAF NÊN
ADTS (AAC) NÊN
MP3 NÊN
Phụ đề chi tiết
CEA-608 NÊN
CEA-708 NÊN
WebVTT NÊN
Siêu dữ liệu
Mã nhận dạng 3 NÊN
SCTE-35 KHÔNG NÊN
Bảo vệ nội dung
AES-128 NÊN
Mẫu AES-128 KHÔNG NÊN
Widevine NÊN API 19+ (lược đồ "cenc") và 25+ (lược đồ cbcs)
PlayReady SL2000 NÊN Chỉ phát hành cho Android TV
Kiểm soát máy chủ
Thông tin cập nhật về Delta NÊN
Chặn tải lại danh sách phát NÊN
Chặn hoạt động tải gợi ý tải trước NÊN Ngoại trừ các dải ô có độ dài không xác định
Phát trực tiếp
Phát trực tiếp định kỳ NÊN
HLS độ trễ thấp (Táo) NÊN
HLS độ trễ thấp (Cộng đồng) KHÔNG NÊN
Dữ liệu ứng dụng đa phương tiện chung (CMCD) NÊN Hướng dẫn tích hợp

Sử dụng MediaItem

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

Kotlin

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

Groovy

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

Sau đó, bạn có thể tạo MediaItem cho URI danh sách phát HLS và truyền URI đó cho người chơi.

Kotlin

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

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

URI của mục nội dung đa phương tiện có thể trỏ đến danh sách phát nội dung nghe nhìn hoặc danh sách phát đa biến thể. Nếu URI trỏ đến một danh sách phát đa biến thể khai báo nhiều thẻ #EXT-X-STREAM-INF, thì ExoPlayer sẽ tự động điều chỉnh giữa các biến thể, có tính đến cả băng thông có sẵn và khả năng của thiết bị.

Sử dụng HlsMediaSource

Để có thêm lựa chọn tuỳ chỉnh, bạn có thể tạo HlsMediaSource và truyền trực tiếp đến trình phát thay vì MediaItem.

Kotlin

// Create a data source factory.
val dataSourceFactory: DataSource.Factory = DefaultHttpDataSource.Factory()
// Create a HLS media source pointing to a playlist uri.
val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri))
// Create a player instance.
val player = ExoPlayer.Builder(context).build()
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource)
// Prepare the player.
player.prepare()

Java

// Create a data source factory.
DataSource.Factory dataSourceFactory = new DefaultHttpDataSource.Factory();
// Create a HLS media source pointing to a playlist uri.
HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(MediaItem.fromUri(hlsUri));
// Create a player instance.
ExoPlayer player = new ExoPlayer.Builder(context).build();
// Set the HLS media source as the playlist with a single media item.
player.setMediaSource(hlsMediaSource);
// Prepare the player.
player.prepare();

Truy cập 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 HLS, bạn nên truyền đối tượng được trả về đến HlsManifest. Lệnh gọi lại onTimelineChanged của Player.Listener cũng được gọi mỗi khi 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ể thực hiện một việc nào đó 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 HlsManifest) {
        // 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) {
          HlsManifest hlsManifest = (HlsManifest) manifest;
          // Do something with the manifest.
        }
      }
    });

Tuỳ chỉnh tính năng 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 ví dụ.

Tắt tính năng chuẩn bị không phân đoạn

Theo mặc định, ExoPlayer sẽ sử dụng quá trình chuẩn bị phân đoạn. Điều này có nghĩa là ExoPlayer sẽ chỉ sử dụng thông tin trong danh sách phát đa biến thể để chuẩn bị luồng. Quá trình này hoạt động nếu các thẻ #EXT-X-STREAM-INF chứa thuộc tính CODECS.

Bạn có thể cần tắt tính năng này nếu phân khúc nội dung đa phương tiện của bạn chứa các bản nhạc có phụ đề kết hợp kết hợp mà không được khai báo trong danh sách phát đa biến thể bằng thẻ #EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS. Nếu không, các bản phụ đề chi tiết này sẽ không được phát hiện và phát. Bạn có thể tắt tính năng chuẩn bị không phân đoạn trong HlsMediaSource.Factory như minh hoạ trong đoạn mã sau. Xin lưu ý rằng việc này sẽ làm tăng thời gian khởi động vì ExoPlayer cần tải một phân đoạn nội dung nghe nhìn xuống để khám phá các bản nhạc bổ sung này. Thay vào đó, bạn nên khai báo các bản nhạc có phụ đề đóng trong danh sách phát đa biến thể.

Kotlin

val hlsMediaSource =
  HlsMediaSource.Factory(dataSourceFactory)
    .setAllowChunklessPreparation(false)
    .createMediaSource(MediaItem.fromUri(hlsUri))

Java

HlsMediaSource hlsMediaSource =
    new HlsMediaSource.Factory(dataSourceFactory)
        .setAllowChunklessPreparation(false)
        .createMediaSource(MediaItem.fromUri(hlsUri));

Tạo nội dung HLS chất lượng cao

Để khai thác tối đa ExoPlayer, bạn có thể làm theo một số nguyên tắc để cải thiện nội dung HLS của mình. Hãy đọc bài đăng trên Medium của chúng tôi về tính năng phát bằng HLS trong ExoPlayer để được giải thích đầy đủ. Các điểm chính là:

  • Sử dụng thời lượng phân đoạn chính xác.
  • Sử dụng luồng nội dung nghe nhìn liên tục; tránh thay đổi cấu trúc nội dung nghe nhìn giữa các phân đoạn.
  • Dùng thẻ #EXT-X-INDEPENDENT-SEGMENTS.
  • Ưu tiên các luồng được ẩn, thay vì các tệp có cả video và âm thanh.
  • Đưa tất cả thông tin bạn có vào Danh sách phát đa biến thể.

Những nguyên tắc sau đây áp dụng riêng cho sự kiện phát trực tiếp:

  • Dùng thẻ #EXT-X-PROGRAM-DATE-TIME.
  • Dùng thẻ #EXT-X-DISCONTINUITY-SEQUENCE.
  • Cung cấp một cửa sổ trực tiếp dài. Chỉ cần 1 phút trở lên là đủ.