Interfejs playlist API opiera się na instancjach MediaItem
, które można łatwo utworzyć za pomocą MediaItem.Builder
. W odtwarzaczu MediaItem
jest konwertowany przez MediaSource.Factory
na możliwą do odtworzenia MediaSource
. Bez konfiguracji niestandardowej konwersja jest przeprowadzana przez interfejs DefaultMediaSourceFactory
, który może tworzyć złożone źródła multimediów odpowiadające właściwościom elementu multimedialnego. Poniżej opisujemy niektóre właściwości, które można ustawiać dla elementów 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żna użyć właściwości MediaItem.Builder
. W poniższym przykładzie element multimedialny składa się z identyfikatora i dołączonych metadanych:
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łączanie metadanych może być przydatne podczas aktualizowania interfejsu aplikacji, gdy występują zmiany 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, odpowiednie źródło multimediów jest tworzone automatycznie. Jeśli identyfikator URI ma niestandardowe rozszerzenie lub nie ma żadnego rozszerzenia, można ustawić typ MIME, aby 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:
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();
W tym przykładzie tworzymy element multimedialny na potrzeby treści chronionych przez Widevine. Wewnątrz odtwarzacza DefaultMediaSourceFactory
przekazuje te właściwości do interfejsu DrmSessionManagerProvider
, aby uzyskać DrmSessionManager
, który jest następnie wstrzykiwany w utworzonym elemencie MediaSource
. Działanie DRM można dokładniej dostosować do własnych potrzeb.
Wczytywanie ścieżek z napisami z innego urządzenia
Aby ładować ścieżki napisów z innego urządzenia, podczas tworzenia elementu multimedialnego można dodać MediaItem.Subtitle
instancję:
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
będzie używać elementu MergingMediaSource
, aby połączyć źródło multimediów treści z SingleSampleMediaSource
w przypadku każdej ścieżki z napisami. DefaultMediaSourceFactory
nie obsługuje wyświetlania napisów z innych urządzeń w przypadku DASH z wieloma przedziałami czasu.
Klipowanie 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
będzie używać elementu ClippingMediaSource
do oznaczania źródła multimediów. Istnieją też dodatkowe właściwości przycinania. Więcej informacji znajdziesz w dokumentacji Javadoc (MediaItem.Builder
).
Wstawianie reklam
Aby wstawić 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();
Na potrzeby wewnętrzne 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 musi też mieć odpowiednio DefaultMediaSourceFactory
skonfigurowane swoje.