Elementy multimedialne

Interfejs playlist API opiera się na MediaItem instancjach, które można w wygodny sposób utworzyć za pomocą 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 podano niektóre z właściwości, które można ustawić w elementach multimedialnych. poniżej.

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);

W pozostałych przypadkach możesz użyć MediaItem.Builder. W poniższym przykładzie Element multimedialny jest utworzony 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 aktualizacji UI aplikacji podczas przejścia na playlistę.

Obrazy

Odtwarzanie obrazów wymaga określenia czasu trwania w elemencie multimedialnym obraz powinien być widoczny 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 dla multimediów 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. identyfikator UUID, jest wymagany, wszystkie 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();

Wewnątrz odtwarzacza, DefaultMediaSourceFactory przekazuje te właściwości do funkcji DrmSessionManagerProvider, aby uzyskać DrmSessionManager, czyli wstrzyknięto do utworzonego MediaSource. Działanie DRM może być bardziej spersonalizowane do własnych potrzeb.

Wczytywanie ścieżek napisów z innego urządzenia

Aby pobrać ścieżki napisów z innego urządzenia, można dodać instancje MediaItem.Subtitle, gdy 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ą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żyje ClippingMediaSource do zapakowania źródła treści multimedialnych. 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 umieszcza źródło multimediów w elemencie typu AdsMediaSource, aby wstawić reklamy określone przez tag reklamy. Aby to działało, klucz odtwarzacz musi też mieć uprawnienie DefaultMediaSourceFactory odpowiednio skonfigurowane.