Quản lý và phát nội dung

Trang này mô tả cách sử dụng trình quản lý tải trước để quản lý nội dung video. Bằng cách sử dụng trình quản lý tải trước, bạn có thể mang lại trải nghiệm tốt hơn cho người dùng; khi người dùng chuyển từ một mục nội dung nghe nhìn sang một mục khác, quá trình phát sẽ bắt đầu nhanh hơn vì trình quản lý đã tải một số nội dung.

Trang này trình bày các chủ đề sau:

Thêm các mục nội dung nghe nhìn vào trình quản lý tải trước

Bạn phải cho trình quản lý tải trước biết về từng mục nội dung nghe nhìn mà trình quản lý này sẽ theo dõi. Ví dụ: nếu ứng dụng của bạn có một băng chuyền video, bạn sẽ thêm các video đó vào trình quản lý tải trước. Tuỳ thuộc vào trường hợp sử dụng, bạn có thể thêm tất cả video hoặc chỉ thêm những video gần với video đang phát. Sau này, bạn cũng có thể thêm các mục mới vào trình quản lý tải trước.

Để thực hiện việc này, hãy sử dụng một phương thức thêm hàng loạt như addMediaItems. Ngoài ra, bạn có thể gọi add (hoặc addMediaSource) để thêm từng mục nội dung nghe nhìn. Tuy nhiên, việc thêm từng mục nội dung đa phương tiện riêng lẻ sẽ không tự động kích hoạt quá trình tải trước. Khi sử dụng các phương thức riêng lẻ, bạn phải gọi rõ ràng invalidate sau khi thêm xong các mục để cho trình quản lý tải trước biết rằng cần cập nhật mức độ ưu tiên và bắt đầu tải trước.

val initialMediaItems = pullMediaItemsFromService(count = 20)
val rankingDataList = initialMediaItems.indices.toList()
preloadManager.addMediaItems(initialMediaItems, rankingDataList)

Các điểm chính về mã

  • Đoạn mã này cho biết cách điền trước trình quản lý tải trước ở chế độ hàng loạt sau khi bạn tạo trình quản lý này. Bạn có thể gọi addMediaItems để thêm các mục vào một trình quản lý tải trước hiện có đã được điền sẵn.
  • Trong đoạn mã này, pullMediaItemsFromService() là logic của ứng dụng để tìm nạp danh sách nội dung cần phát. Mã này gọi phương thức đó để tìm nạp danh sách gồm tối đa 20 mục.
  • preloadManagerDefaultPreloadManager được tạo trong Tạo một DefaultPreloadManager.
  • rankingData là giá trị mà trình quản lý tải trước dùng để xác định mức độ ưu tiên của từng mục nội dung nghe nhìn. Đối với DefaultPreloadManager, rankingData là một số nguyên biểu thị vị trí của mặt hàng trong băng chuyền. Trình quản lý tải trước xác định mức độ ưu tiên dựa trên khoảng cách của từng mục so với mục đang phát.

Tìm nạp và phát nội dung nghe nhìn

Khi người dùng chuyển sang một mục nội dung nghe nhìn mới, bạn cần lấy mục nội dung nghe nhìn đó từ trình quản lý tải trước. Nếu trình quản lý tải trước đã tải bất kỳ nội dung nào, thì nội dung đó sẽ phát nhanh hơn so với khi bạn không sử dụng trình quản lý tải trước. Nếu trình quản lý tải trước chưa tải nội dung từ mục đó, thì nội dung sẽ phát bình thường.

Bạn cũng cần cập nhật chỉ mục phát hiện nhạc hiện tại trên trình quản lý tải trước bằng cách gọi setCurrentPlayingIndex. Thao tác này cho phép trình quản lý tải trước xác định mức độ ưu tiên của các thao tác tải trước trong tương lai.

// When a media item is about to be displayed on the screen
val mediaSource = preloadManager.getMediaSource(mediaItem)
if (mediaSource != null) {
  player.setMediaSource(mediaSource)
} else {
  // If the mediaSource is null, its mediaItem hasn't been added to the preload
  // manager yet. Send it directly to the player when it's about to play.
  player.setMediaItem(mediaItem)
}
player.prepare()

// When the media item is being displayed at the center of the screen ("in focus")
player.play()
// Update the current playing index to let the preload manager know where the user
// is in the carousel/pagination/list.
preloadManager.setCurrentPlayingIndex(currentIndex)

Các điểm chính về mã

  • player là Media3 ExoPlayer mà ứng dụng đang dùng để phát nội dung. Bạn phải tạo trình phát đó bằng cách gọi DefaultPreloadManager.Builder.buildExoPlayer() trên cùng một trình tạo mà bạn đã dùng để tạo trình quản lý tải trước.
  • Khi người dùng chuyển sang một mục nội dung nghe nhìn mới, ứng dụng sẽ gọi getMediaSource() để lấy nguồn nội dung nghe nhìn từ trình quản lý tải trước. Đây phải là một mediaItem mà bạn đã thêm vào trình quản lý tải trước. Không sao nếu trình quản lý tải trước chưa bắt đầu tải nội dung; trong trường hợp đó, trình quản lý sẽ trả về một MediaSource không có dữ liệu được tải trước. Ví dụ: điều này có thể xảy ra nếu người dùng đột ngột chuyển đến một vị trí xa trong băng chuyền.
  • Sau khi người dùng phát mục nội dung nghe nhìn mới, hãy gọi setCurrentPlayingIndex để cho trình quản lý tải trước biết vị trí của mục mới trong băng chuyền. Trình quản lý tải trước cần thông tin đó để ưu tiên tải mục tiếp theo.

Xoá các mục khỏi trình quản lý tải trước

Để duy trì hiệu quả của trình quản lý tải trước, bạn nên xoá những mục mà trình quản lý tải trước không cần theo dõi nữa. Bạn cũng có thể xoá những mục vẫn còn trong băng chuyền nhưng ở quá xa vị trí hiện tại của người dùng. Ví dụ: bạn có thể quyết định rằng nếu một mục cách xa hơn 15 mục so với nội dung mà người dùng đang xem, thì mục đó không cần được tải trước. Trong trường hợp đó, bạn sẽ xoá các mục khi chúng ở quá xa. Nếu người dùng di chuyển trở lại những mục đã xoá đó, bạn luôn có thể thêm lại các mục đó.

Nếu có danh sách các mục nội dung nghe nhìn cần xoá, bạn có thể dùng removeMediaItems. Ngoài ra, bạn có thể gọi remove (hoặc removeMediaSource) để xoá từng mục nội dung nghe nhìn.

preloadManager.removeMediaItems(mediaItemsToRemove)

Các điểm chính về mã

  • Nếu muốn xoá tất cả các mục khỏi trình quản lý tải trước, bạn có thể gọi reset() thay vì remove(). Phương pháp này hữu ích nếu bạn cần thay đổi tất cả các mục trong băng chuyền. Trong trường hợp đó, sau khi xoá các mục, bạn sẽ cần thêm các mục mới vào trình quản lý tải trước.

Giải phóng trình quản lý tải trước khi bạn dùng xong

Khi không cần trình quản lý tải trước nữa, bạn phải giải phóng trình quản lý này để giải phóng tài nguyên của trình quản lý. Đặc biệt, hãy nhớ giải phóng đối tượng này khi hoạt động của bạn bị huỷ.

preloadManager.release()

Các điểm chính về mã

  • Bạn không được gọi bất kỳ phương thức nào của đối tượng sau khi phát hành.
  • Nếu bạn cần tạo một trình quản lý tải trước khác, hãy tạo một DefaultPreloadManager.Builder mới và dùng trình quản lý đó để tạo DefaultPreloadManager. Đừng cố gắng sử dụng lại trình tạo cũ.