API danh sách phát dựa trên các thực thể MediaItem
. API này có thể được tạo một cách thuận tiện
khi sử dụng MediaItem.Builder
. Bên trong trình phát, MediaItem
được chuyển đổi thành
MediaSource
có thể phát của MediaSource.Factory
. Không có
cấu hình tuỳ chỉnh,
lượt chuyển đổi này do DefaultMediaSourceFactory
thực hiện
có khả năng tạo ra các nguồn truyền thông phức tạp tương ứng với tính chất của
mục nội dung nghe nhìn. Bạn có thể nêu một số thuộc tính có thể thiết lập cho các mục nội dung đa phương tiện
bên dưới.
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 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 khoảng thời gian hình ảnh sẽ hiển thị trong khi phát lại. Xem Trang hướng dẫn về Hình ảnh để biết thêm thông tin về Ảnh chuyển động và Thư 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, thì loại MIME có thể được đặt 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. 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
người chơi, DefaultMediaSourceFactory
sẽ chuyển các thuộc tính này đến một
DrmSessionManagerProvider
để có được DrmSessionManager
, sau đó
được chèn vào MediaSource
được tạo. Hành vi DRM có thể là
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 phiên bản 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 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 đoạn nội dung mà một mục nội dung đa phương tiện tham chiếu, hãy đặt tuỳ chỉnh vị trí bắt đầu và kết thúc:
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ẽ bao bọc nguồn phương tiện nội dung trong một
AdsMediaSource
để chèn quảng cáo theo quy định 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.