Interfejs playlist API opiera się na instancjach MediaItem
, które można wygodnie tworzyć za pomocą interfejsu MediaItem.Builder
. W odtwarzaczu MediaItem
jest przekształcany w odtwarzalny MediaSource
przez MediaSource.Factory
. Bez konfiguracji niestandardowej ta konwersja jest przeprowadzana przez DefaultMediaSourceFactory
, który może tworzyć złożone źródła multimediów odpowiadające właściwościom elementu multimedialnego. Poniżej znajdziesz niektóre właściwości, które można ustawić dla elementów multimediów.
proste elementy multimedialne,
Element multimedialny składający się tylko z identyfikatora URI strumienia można utworzyć za pomocą metody fromUri
:
Kotlin
val mediaItem = MediaItem.fromUri(videoUri)
Java
MediaItem mediaItem = MediaItem.fromUri(videoUri);
We wszystkich innych przypadkach możesz użyć MediaItem.Builder
. W tym przykładzie element multimedialny jest tworzony z identyfikatorem i załą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łączanie metadanych może być przydatne do aktualizowania interfejsu aplikacji podczas przełączania się playlist.
Obrazy
Odtwarzanie obrazów wymaga określenia czasu trwania w elemencie multimedialnym, aby wskazać, jak długo obraz ma być wyświetlany podczas odtwarzania. Więcej informacji o filmach poklatkowych i bibliotekach ładowania obrazów (np. Glide) znajdziesz na stronie przewodnika Obrazy.
Kotlin
val mediaItem = MediaItem.Builder().setUri(imageUri).setImageDurationMs(3000).build()
Java
MediaItem mediaItem = new MediaItem.Builder().setUri(imageUri).setImageDurationMs(3_000).build();
Niestandardowe rozszerzenia plików w przypadku multimediów adaptacyjnych
ExoPlayer udostępnia adaptacyjne źródła multimediów dla DASH, HLS i SmoothStreaming. Jeśli adres URI takiego elementu multimedialnego dostosowującego się do urządzenia kończy się standardowym rozszerzeniem pliku, odpowiedni źródło multimediów jest tworzone automatycznie. Jeśli URI ma niestandardowe rozszerzenie lub nie ma go wcale, typ MIME można ustawić wprost, 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 strumieni multimediów progresywnych typ MIME nie jest wymagany.
Treść chroniona
W przypadku treści chronionych należy ustawić właściwości DRM elementu multimedialnego. Właściwość UUID jest wymagana, a pozostałe właściwości są opcjonalne.
Przykład konfiguracji do odtwarzania elementu chronionego za pomocą DRM Widevine, w którym identyfikator URI licencji nie jest dostępny bezpośrednio w mediach (np. na playliście DASH) i wymagane są liczne sesje (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();
W odtwarzaczu DefaultMediaSourceFactory
przekaże te właściwości do DrmSessionManagerProvider
, aby uzyskać DrmSessionManager
, który następnie zostanie wstrzyknięty do utworzonego MediaSource
. Zachowanie DRM można dostosować do swoich potrzeb.
Instalowanie ścieżek napisów z nieoficjalnych źródeł
Aby wczytać ścieżki z napisami z dysku, możesz dodać MediaItem.Subtitle
wystąpienia podczas tworzenia elementu multimedialnego:
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żywa MergingMediaSource
, aby połączyć źródło multimediów treści z SingleSampleMediaSource
dla każdej ścieżki napisów. DefaultMediaSourceFactory
nie obsługuje sideloadowania napisów w przypadku DASH wielookresowego.
Przycinanie strumienia multimediów
Aby przyciąć treści, do których odwołuje się element multimedialny, ustaw niestandardowe pozycje początkową i końcową:
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 elementu ClippingMediaSource
do owinięcia źródła multimediów treści. Istnieją dodatkowe właściwości przycinania. Aby dowiedzieć się więcej, zapoznaj się z dokumentacją Javadoc MediaItem.Builder
.
Wstawianie reklam
Aby wstawić reklamy, należy ustawić właściwość URI tagu reklamy w elemencie multimedialnym:
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
owija źródło multimediów treści w AdsMediaSource
, aby wstawić reklamy zgodnie z tagiem reklamy. Aby to działało, w odtwarzaczu musisz też odpowiednio skonfigurować DefaultMediaSourceFactory
.