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 element MediaItem jest przekształcany w element MediaSource przez MediaSource.Factory. Bez konfiguracji niestandardowej tę konwersję wykonuje DefaultMediaSourceFactory, który potrafi tworzyć złożone źródła multimediów zgodne z właściwościami elementu multimedialnego. Poniżej opisujemy niektóre z właściwości, które można ustawić w elementach multimedialnych.

Proste elementy multimedialne

Element multimedialny zawierający tylko identyfikator URI strumienia można utworzyć za pomocą wygodnej metody fromUri:

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 kilkoma 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łączenie metadanych może być przydatne podczas aktualizacji interfejsu aplikacji podczas przechodzenia z playlist.

Obsługa niestandardowych rozszerzeń plików

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

Przykładowa konfiguracja odtwarzania elementu chronionego Widevine DRM, w której identyfikator URI licencji nie jest dostępny bezpośrednio w multimediach (np. na playliście DASH) i wymaga wielu sesji (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();

Wewnątrz odtwarzacza DefaultMediaSourceFactory przekazuje te właściwości do DrmSessionManagerProvider, aby uzyskać DrmSessionManager, który następnie jest wstrzykiwany do utworzonego ciągu MediaSource. Działanie DRM można jeszcze bardziej dostosować do własnych potrzeb.

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

Aby pobrać ścieżki napisów z innego urządzenia, podczas tworzenia elementu multimedialnego można dodać instancje MediaItem.Subtitle:

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żyje MergingMediaSource, aby dla każdej ścieżki napisów połączyć źródło multimediów treści z tagiem SingleSampleMediaSource. DefaultMediaSourceFactory nie obsługuje instalowania napisów z nieoficjalnych źródeł na potrzeby 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żywa ClippingMediaSource do opakowywania źródła multimediów. Istnieją dodatkowe właściwości przycinania. Więcej informacji znajdziesz w dokumencie MediaItem.BuilderJavadoc.

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 AdsMediaSource, aby wstawić reklamy zgodnie z definicją w tagu reklamy. Aby to zadziałało, odtwarzacz również musi być odpowiednio skonfigurowanyDefaultMediaSourceFactory odtwarzacz.