Elementy multimedialne

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.