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 MediaItem.Builder
. Bên trong trình phát, MediaItem
đượ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, lượt chuyển đổi này sẽ do DefaultMediaSourceFactory
thực hiện. Công cụ 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 đa phương tiện. Dưới đây là một số thuộc tính có thể thiết lập đượ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ộ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.
Xử lý đuôi tệp không chuẩn
ExoPlayer cung cấp các nguồn nội dung nghe nhìn thích ứng cho DASH, HLS và mootStreaming. Nếu URI của một mục nội dung nghe nhìn thích ứng đó kết thúc bằng đ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, 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 liên tục, không cần có 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. Bắt buộc phải có mã nhận dạng duy nhất (UUID), tất cả các thuộc tính khác đều 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 nghe nhìn (ví dụ: trong danh sách phát DASH) và bắt buộc phải có nhiều phiên (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 đó đượ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 phụ đề không qua cửa hàng, bạn có thể thêm các phiên bản MediaItem.Subtitle
khi tạo 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 cục 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 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 được một mục nội dung đa phương tiện tham chiếu, 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. 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 nghe nhì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 định cấu hình DefaultMediaSourceFactory
cho phù hợp.