Mục nội dung nghe nhìn

API danh sách phát dựa trên các thực thể MediaItem có thể được tạo 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 sẽ được MediaSource.Factory chuyển đổi thành MediaSource có thể chơi. Nếu không có cấu hình tuỳ chỉnh, việc chuyển đổi này sẽ được thực hiện bằng DefaultMediaSourceFactory. Phương thức này có thể 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ể đặt được cho các mục nội dung đa phương tiệ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 đa phương tiện chỉ bao gồm URI luồng 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 đa phương tiện được tạo bằng 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.

Xử lý các đuôi tệp không theo chuẩn

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ục nội dung nghe nhìn thích ứng đó kết thúc bằng một đuôi tệp 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 loại MIME một cách rõ ràng để cho biết loại mục nội dung đa phương tiệ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 tiến bộ, 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 nên đặt thuộc tính DRM của mục nội dung đa phương tiện:

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

Ví dụ này tạo một mục nội dung đa phương tiện cho nội dung được bảo vệ của Widevine. 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 đó, mã này được chèn vào MediaSource đã tạo. Hành vi DRM có thể được tuỳ chỉnh thêm theo nhu cầu của bạn.

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 đa phương tiệ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 nội dung đa phương tiện với SingleSampleMediaSource cho từng bản phụ đề. DefaultMediaSourceFactory không hỗ trợ cài đặt phụ đề không qua cửa hàng ứng dụng 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 nội dung đa phương tiện. Ngoài ra còn có các thuộc tính cắt khác. 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ụ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 do thẻ quảng cáo xác định. Để làm được điều này, người chơi cũng cần phải định cấu hình cho phù hợp DefaultMediaSourceFactory.