Mục nội dung nghe nhìn

API danh sách phát dựa trên các thực thể MediaItem. Bạn có thể dễ dàng tạo các thực thể này bằng MediaItem.Builder. Bên trong trình phát, MediaItem được chuyển đổi thành MediaSource có thể phát bằng MediaSource.Factory. Nếu không có cấu hình tuỳ chỉnh, thì quá trình chuyển đổi này sẽ được thực hiện bằng DefaultMediaSourceFactory. DefaultMediaSourceFactory này có khả năng tạo các nguồn nội dung nghe nhìn phức tạp tương ứng với các thuộc tính của mục nội dung nghe nhìn. Dưới đây là một số thuộc tính có thể được đặt trên các mục nội dung nghe nhìn.

Mục nội dung nghe nhìn đơn giản

Bạn có thể tạo một mục nội dung nghe nhìn chỉ bao gồm URI luồng phát bằng phương thức tiện lợi fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

Đối với tất cả các trường hợp khác, bạn có thể sử dụng MediaItem.Builder. Trong ví dụ sau, một mục nội dung nghe nhìn được tạo bằng một mã nhận dạng và một số siêu dữ liệu được đính kèm:

Kotlin

val mediaItem =
  MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setMediaId(mediaId).setTag(myAppData).setUri(videoUri).build();

Việc đính kèm siêu dữ liệu có thể hữu ích khi bạn cập nhật giao diện người dùng của ứng dụng khi quá trình chuyển đổi danh sách phát diễn ra.

Hình ảnh

Để phát hình ảnh, bạn cần chỉ định thời lượng trong mục nội dung nghe nhìn để xác định thời gian hiển thị hình ảnh trong quá trình phát. Hãy xem trang hướng dẫn về Hình ảnh để biết thêm thông tin về Ảnh độngThư viện tải hình ảnh (ví dụ: Glide).

Kotlin

val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();

Đuôi tệp không theo tiêu chuẩn cho nội dung nghe nhìn thích ứng

ExoPlayer cung cấp các nguồn nội dung nghe nhìn thích ứng cho DASH, HLS và SmoothStreaming. Nếu URI của một mục nội dung nghe nhìn thích ứng như vậy kết thúc bằng một đuôi tệp tiêu chuẩn, thì nguồn nội dung nghe nhìn tương ứng sẽ tự động được tạo. Nếu URI có một phần mở rộng không chuẩn hoặc không có phần mở rộng nào, thì bạn có thể đặt loại MIME một cách rõ ràng để cho biết loại mục nội dung nghe nhìn:

Kotlin

val mediaItem =
  MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build()

Java

MediaItem mediaItem =
    new MediaItem.Builder().setUri(hlsUri).setMimeType(MimeTypes.APPLICATION_M3U8).build();

Đối với luồng nội dung nghe nhìn phát trực tuyến từng phần, bạn không bắt buộc phải có loại MIME.

Nội dung được bảo vệ

Đối với nội dung được bảo vệ, bạn nên đặt các thuộc tính DRM của mục nội dung nghe nhìn. UUID là bắt buộc, tất cả các thuộc tính khác đều không bắt buộc.

Ví dụ về cấu hình để phát một mục được bảo vệ bằng Widevine DRM, trong đó URI giấy phép không có sẵn trực tiếp trong nội dung nghe nhìn (ví dụ: trong danh sách phát DASH) và cần có nhiều phiên (ví dụ: do xoay khoá):

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setDrmConfiguration(
      MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
        .setLicenseUri(licenseUri)
        .setMultiSession(true)
        .setLicenseRequestHeaders(httpRequestHeaders)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setDrmConfiguration(
            new MediaItem.DrmConfiguration.Builder(C.WIDEVINE_UUID)
                .setLicenseUri(licenseUri)
                .setMultiSession(true)
                .setLicenseRequestHeaders(httpRequestHeaders)
                .build())
        .build();

Bên trong trình phát, DefaultMediaSourceFactory sẽ truyền các thuộc tính này đến DrmSessionManagerProvider để lấy DrmSessionManager, sau đó được chèn vào MediaSource đã tạo. Bạn có thể tuỳ chỉnh thêm hành vi DRM cho phù hợp với nhu cầu của mình.

Cài đặt bản phụ đề không qua cửa hàng ứng dụng

Để tải phụ đề lên từ bên ngoài, bạn có thể thêm các thực thể MediaItem.Subtitle khi tạo một mục nội dung nghe nhìn:

Kotlin

val subtitle =
  MediaItem.SubtitleConfiguration.Builder(subtitleUri)
    .setMimeType(mimeType) // The correct MIME type (required).
    .setLanguage(language) // The subtitle language (optional).
    .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
    .build()
val mediaItem =
  MediaItem.Builder().setUri(videoUri).setSubtitleConfigurations(listOf(subtitle)).build()

Java

MediaItem.SubtitleConfiguration subtitle =
    new MediaItem.SubtitleConfiguration.Builder(subtitleUri)
        .setMimeType(mimeType) // The correct MIME type (required).
        .setLanguage(language) // The subtitle language (optional).
        .setSelectionFlags(selectionFlags) // Selection flags for the track (optional).
        .build();
MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setSubtitleConfigurations(ImmutableList.of(subtitle))
        .build();

Về nội bộ, DefaultMediaSourceFactory sẽ dùng MergingMediaSource để kết hợp nguồn nội dung đa phương tiện với SingleSampleMediaSource cho mỗi bản phụ đề. DefaultMediaSourceFactory không hỗ trợ tải phụ đề lên cho DASH nhiều khoảng thời gian.

Cắt một luồng nội dung nghe nhìn

Để cắt nội dung được tham chiếu bởi một mục nội dung nghe nhìn, hãy đặt vị trí bắt đầu và kết thúc tuỳ chỉnh:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setClippingConfiguration(
      MediaItem.ClippingConfiguration.Builder()
        .setStartPositionMs(startPositionMs)
        .setEndPositionMs(endPositionMs)
        .build()
    )
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setClippingConfiguration(
            new ClippingConfiguration.Builder()
                .setStartPositionMs(startPositionMs)
                .setEndPositionMs(endPositionMs)
                .build())
        .build();

Về nội bộ, DefaultMediaSourceFactory sẽ dùng ClippingMediaSource để gói nguồn nội dung đa phương tiện. Có các thuộc tính bổ sung để cắt. Hãy xem MediaItem.Builder Javadoc để biết thêm thông tin chi tiết.

Chèn quảng cáo

Để chèn quảng cáo, bạn phải đặt thuộc tính URI thẻ quảng cáo của một mục nội dung nghe nhìn:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

Về nội bộ, DefaultMediaSourceFactory sẽ bao bọc nguồn nội dung nghe nhìn trong một AdsMediaSource để chèn quảng cáo theo định nghĩa của thẻ quảng cáo. Để điều này hoạt động, trình phát cũng cần phải được định cấu hình DefaultMediaSourceFactory cho phù hợp.