Interfejs playlist API opiera się na MediaItem
instancjach, które można w wygodny sposób utworzyć za pomocą MediaItem.Builder
. Wewnątrz odtwarzacza element MediaItem
jest przekształcany w element MediaSource
przez MediaSource.Factory
. Bez konfiguracji niestandardowej tę konwersję wykonuje DefaultMediaSourceFactory
, który potrafi tworzyć złożone źródła multimediów zgodne z właściwościami elementu multimedialnego. Poniżej opisujemy niektóre z właściwości, które można ustawić w elementach multimedialnych.
Proste elementy multimedialne
Element multimedialny zawierający tylko identyfikator URI strumienia można utworzyć za pomocą wygodnej metody fromUri
:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
W pozostałych przypadkach możesz użyć MediaItem.Builder
. W poniższym przykładzie element multimedialny jest utworzony z identyfikatorem i kilkoma dołączonymi metadanymi:
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();
Dołączenie metadanych może być przydatne podczas aktualizacji interfejsu aplikacji podczas przechodzenia z playlist.
Obsługa niestandardowych rozszerzeń plików
ExoPlayer udostępnia adaptacyjne źródła multimediów dla DASH, HLS i SmoothStreaming. Jeśli identyfikator URI takiego adaptacyjnego elementu multimedialnego kończy się standardowym rozszerzeniem pliku, automatycznie tworzone jest odpowiednie źródło multimediów. Jeśli identyfikator URI ma rozszerzenie niestandardowe lub nie ma wcale, typ MIME można ustawić bezpośrednio, by wskazać typ elementu multimedialnego:
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();
W przypadku progresywnych strumieni multimediów typ MIME nie jest wymagany.
Treść chroniona
W przypadku treści chronionych należy ustawić właściwości DRM elementu multimedialnego. Identyfikator UUID jest wymagany, a pozostałe właściwości są opcjonalne.
Przykładowa konfiguracja odtwarzania elementu chronionego Widevine DRM, w której identyfikator URI licencji nie jest dostępny bezpośrednio w multimediach (np. na playliście DASH) i wymaga wielu sesji (np. z powodu rotacji klucza):
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();
Wewnątrz odtwarzacza DefaultMediaSourceFactory
przekazuje te właściwości do DrmSessionManagerProvider
, aby uzyskać DrmSessionManager
, który następnie jest wstrzykiwany do utworzonego ciągu MediaSource
. Działanie DRM można jeszcze bardziej dostosować do własnych potrzeb.
Wczytywanie ścieżek napisów z innego urządzenia
Aby pobrać ścieżki napisów z innego urządzenia, podczas tworzenia elementu multimedialnego można dodać instancje MediaItem.Subtitle
:
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();
Wewnętrznie DefaultMediaSourceFactory
użyje MergingMediaSource
, aby dla każdej ścieżki napisów połączyć źródło multimediów treści z tagiem SingleSampleMediaSource
. DefaultMediaSourceFactory
nie obsługuje instalowania napisów z nieoficjalnych źródeł na potrzeby DASH z wieloma przedziałami czasu.
Przycinanie strumienia multimediów
Aby przyciąć treści, do których odwołuje się element multimedialny, ustaw niestandardowe pozycje początkowe i końcowe:
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();
Wewnętrznie DefaultMediaSourceFactory
używa ClippingMediaSource
do opakowywania źródła multimediów. Istnieją dodatkowe właściwości przycinania. Więcej informacji znajdziesz w dokumencie MediaItem.Builder
Javadoc.
Wstawianie reklam
Aby wstawiać reklamy, ustaw właściwość identyfikatora URI tagu reklamy elementu multimedialnego:
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();
Wewnętrznie DefaultMediaSourceFactory
umieszcza źródło multimediów w elemencie AdsMediaSource
, aby wstawić reklamy zgodnie z definicją w tagu reklamy. Aby to zadziałało, odtwarzacz również musi być odpowiednio skonfigurowanyDefaultMediaSourceFactory
odtwarzacz.