Interfejs playlist API opiera się na instancjach MediaItem
, które można wygodnie tworzyć za pomocą interfejsu MediaItem.Builder
. Wewnątrz odtwarzacza MediaItem
jest przekształcany w
gra MediaSource
przez MediaSource.Factory
. Bez
konfiguracji niestandardowej,
tę konwersję wykonuje DefaultMediaSourceFactory
, który jest
jest w stanie tworzyć złożone źródła multimediów odpowiadające właściwościom
element multimedialny. Poniżej znajdziesz niektóre właściwości, które można ustawić dla elementów multimediów.
proste elementy multimedialne,
Element multimedialny zawierający tylko identyfikator URI strumienia można utworzyć za pomocą fromUri
metody wygodnej:
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 aktualizacji UI aplikacji podczas przejścia na 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. Zobacz Na stronie przewodnika po obrazach znajdziesz więcej informacji: Zdjęcia ruchome i Wczytywanie biblioteki obrazów (na przykład Glide).
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 multimediach adaptacyjnych
ExoPlayer udostępnia adaptacyjne źródła multimediów dla DASH, HLS SmoothStreaming. Jeśli identyfikator URI takiego adaptacyjnego elementu multimedialnego kończy się znakiem standardu , odpowiednie źródło multimediów zostanie utworzone automatycznie. Jeśli Identyfikator URI ma niestandardowe rozszerzenie lub nie ma żadnego rozszerzenia, typ MIME musi być wyraźnie określony, 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. Właściwość UUID jest wymagana, a pozostałe właściwości są opcjonalne.
Przykładowa konfiguracja odtwarzania elementu chronionego przez Widevine DRM, gdzie identyfikator URI licencji nie jest dostępny bezpośrednio w multimediach (np. na playliście DASH) i wymaganych jest wiele sesji (np. z powodu rotacji kluczy):
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
będzie używać interfejsu MergingMediaSource
do:
Połącz źródło multimediów treści z tagiem SingleSampleMediaSource
dla każdego parametru
ścieżki z napisami. Aplikacja DefaultMediaSourceFactory
nie obsługuje instalowania z nieoficjalnych źródeł
napisy do 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ą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. Zobacz
MediaItem.Builder
Javadoc, aby dowiedzieć się więcej.
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
owija źródło multimediów treści w AdsMediaSource
, aby wstawić reklamy zgodnie z tagiem reklamy. Aby to działało, odtwarzacz musi mieć też odpowiednio skonfigurowany element DefaultMediaSourceFactory
.