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ể tạo các thực thể này một cách thuận tiện bằng cách sử dụ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, quá trình chuyển đổi này sẽ do DefaultMediaSourceFactory thực hiện. DefaultMediaSourceFactory có thể tạo các nguồn nội dung đa phương tiện phức tạp tương ứng với các thuộc tính của mục nội dung đa phương tiện. Một số thuộc tính có thể được đặt trên các mục nội dung nghe nhìn được nêu dưới đây.

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

Bạn có thể tạo một mục nội dung đa phương tiện chỉ bao gồm URI luồng bằng fromUri phương thức thuận tiện:

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ục nội dung đa phương tiện được tạo bằng một mã nhận dạng và một số siêu dữ liệu đí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 cho việc 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

Việc phát hình ảnh cần phải có thời lượng trong mục nội dung đa phương tiện để chỉ định thời lượng hình ảnh sẽ hiển thị trong khi phát lại. 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 chuẩn cho nội dung nghe nhìn thích ứng

ExoPlayer cung cấp các nguồn phương tiện thích ứng cho DASH, HLS và Tạo nội dung mượt mà. Nếu URI của một mục nội dung nghe nhìn thích ứng đó kết thúc bằng một tiêu chuẩn thì nguồn nội dung nghe nhìn tương ứng sẽ được tạo tự động. Nếu URI có 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 rõ ràng loại MIME để cho biết loại của 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 đa phương tiện tăng tiến, bạn không bắt buộc phải sử dụng loại MIME.

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

Đối với nội dung được bảo vệ, bạn phải đặt các thuộc tính DRM của mục nội dung đa phương tiện. Mã nhận dạng duy nhất (UUID) là bắt buộc, tất cả các thuộc tính khác là không bắt buộc.

Một cấu hình mẫu để phát một mục được bảo vệ bằng DRM của Widevine, trong đó URI giấy phép không có sẵn trực tiếp trong nội dung đa phương tiện (ví dụ: trong danh sách phát DASH) và cần nhiều phiên hoạt động (ví dụ: do xoay vòng 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 đó chèn vào MediaSource đã tạo. Bạn có thể tuỳ chỉnh thêm hành vi DRM theo 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 các bản phụ đề không qua cửa hàng, 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 =
  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();

Trong nội bộ, DefaultMediaSourceFactory sẽ sử dụng MergingMediaSource để kết hợp nguồn phương tiện nội dung với SingleSampleMediaSource cho mỗi bản phụ đề. DefaultMediaSourceFactory không hỗ trợ cài đặt không qua cửa hàng ứng dụng phụ đề cho DASH nhiều giai đoạn.

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

Để cắt nội dung mà một mục nội dung đa phương tiện tham chiếu đế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();

Trong nội bộ, DefaultMediaSourceFactory sẽ sử dụng ClippingMediaSource để gói nguồn phương tiện nội dung. Có thêm các thuộc tính cắt xén. Xem MediaItem.Builder Javadoc để biết thêm 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ục nội dung đa phương tiện:

Kotlin

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

Java

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

Trong nội bộ, DefaultMediaSourceFactory sẽ gói nguồn nội dung đa phương tiện trong một AdsMediaSource để chèn quảng cáo theo định nghĩa của thẻ quảng cáo. Để làm được điều này, người chơi cũng cần có DefaultMediaSourceFactory được định cấu hình cho phù hợp.