Elementy multimedialne

Interfejs API playlisty opiera się na MediaItem instancjach, które można wygodnie tworzyć za pomocą MediaItem.Builder. W odtwarzaczu MediaItem jest przekształcany w odtwarzalny MediaSource przez MediaSource.Factory. Bez konfiguracji niestandardowej 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. Niektóre właściwości, które można ustawić w przypadku elementów multimedialnych, zostały opisane poniżej.

Proste elementy multimedialne

Element multimedialny składający się tylko z identyfikatora URI strumienia można utworzyć za pomocą wygodnej metody fromUri:

Kotlin

val mediaItem = MediaItem.fromUri(videoUri)

Java

MediaItem mediaItem = MediaItem.fromUri(videoUri);

We wszystkich innych przypadkach można użyć MediaItem.Builder. W przykładzie poniżej element multimedialny jest tworzony z identyfikatorem i 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łączanie metadanych może być przydatne do aktualizowania interfejsu aplikacji podczas przechodzenia między playlistami.

Obrazy

Odtwarzanie obrazów wymaga podania czasu trwania w elemencie multimedialnym, aby określić, jak długo obraz ma być wyświetlany podczas odtwarzania. Więcej informacji o zdjęciach w ruchubibliotekach wczytywania 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 multimediów adaptacyjnych

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, odpowiednie źródło multimediów jest tworzone automatycznie. Jeśli adres URI ma niestandardowe rozszerzenie lub nie ma go wcale, typ MIME można ustawić jawnie, 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. Wymagany jest identyfikator UUID, a wszystkie pozostałe właściwości są opcjonalne.

Przykładowa konfiguracja odtwarzania elementu chronionego za pomocą DRM Widevine, w którym identyfikator URI licencji nie jest dostępny bezpośrednio w multimediach (np. na liście odtwarzania 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 zostanie następnie wstawiony do utworzonego elementu MediaSource. Działanie DRM można dodatkowo dostosować do swoich potrzeb.

Instalowanie ścieżek z napisami z nieoficjalnych źródeł

Aby wczytać ścieżki z napisami, podczas tworzenia elementu multimedialnego można dodać MediaItem.Subtitle wystąpień:

Kotlin

val subtitle =
  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()
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 połączyć źródło multimediów z treścią z SingleSampleMediaSource dla każdego utworu z napisami. DefaultMediaSourceFactory nie obsługuje wczytywania napisów do DASH z wieloma okresami.

Przycinanie strumienia multimediów

Aby przyciąć treść, do której 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żyje ClippingMediaSource, aby otoczyć źródło treści multimedialnych. Istnieją dodatkowe właściwości przycinania. Więcej informacji znajdziesz w MediaItem.Builderdokumentacji Javadoc.

Wstawianie reklam

Aby wstawiać reklamy, należy ustawić właściwość URI tagu reklamy elementu multimedialnego:

Kotlin

val mediaItem =
  MediaItem.Builder()
    .setUri(videoUri)
    .setAdsConfiguration(MediaItem.AdsConfiguration.Builder(adTagUri).build())
    .build()

Java

MediaItem mediaItem =
    new MediaItem.Builder()
        .setUri(videoUri)
        .setAdsConfiguration(new MediaItem.AdsConfiguration.Builder(adTagUri).build())
        .build();

Wewnętrznie DefaultMediaSourceFactory umieści źródło treści w tagu AdsMediaSource, aby wstawiać reklamy zgodnie z definicją w tagu reklamy. Aby to działało, odtwarzacz musi mieć też odpowiednio DefaultMediaSourceFactory skonfigurowane ustawienia.