Elementy multimedialne

Interfejs playlist API opiera się na instancjach MediaItem, które można łatwo utworzyć za pomocą MediaItem.Builder. W odtwarzaczu MediaItem jest konwertowany przez MediaSource.Factory na możliwą do odtworzenia MediaSource. Bez konfiguracji niestandardowej konwersja jest przeprowadzana przez interfejs DefaultMediaSourceFactory, który może tworzyć złożone źródła multimediów odpowiadające właściwościom elementu multimedialnego. Poniżej opisujemy niektóre właściwości, które można ustawiać dla elementów 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żna użyć właściwości MediaItem.Builder. W poniższym przykładzie element multimedialny składa się z identyfikatora i dołączonych metadanych:

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 podczas aktualizowania interfejsu aplikacji, gdy występują zmiany 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, odpowiednie źródło multimediów jest tworzone automatycznie. Jeśli identyfikator URI ma niestandardowe rozszerzenie lub nie ma żadnego rozszerzenia, można ustawić typ MIME, 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:

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 tym przykładzie tworzymy element multimedialny na potrzeby treści chronionych przez Widevine. Wewnątrz odtwarzacza DefaultMediaSourceFactory przekazuje te właściwości do interfejsu DrmSessionManagerProvider, aby uzyskać DrmSessionManager, który jest następnie wstrzykiwany w utworzonym elemencie MediaSource. Działanie DRM można dokładniej dostosować do własnych potrzeb.

Wczytywanie ścieżek z napisami z innego urządzenia

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

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ć elementu MergingMediaSource, aby połączyć źródło multimediów treści z SingleSampleMediaSource w przypadku każdej ścieżki z napisami. DefaultMediaSourceFactory nie obsługuje wyświetlania napisów z innych urządzeń w przypadku DASH z wieloma przedziałami czasu.

Klipowanie 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 będzie używać elementu ClippingMediaSource do oznaczania źródła multimediów. Istnieją też dodatkowe właściwości przycinania. Więcej informacji znajdziesz w dokumentacji Javadoc (MediaItem.Builder).

Wstawianie reklam

Aby wstawić 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();

Na potrzeby wewnętrzne 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 musi też mieć odpowiednio DefaultMediaSourceFactory skonfigurowane swoje.