Elementy multimedialne

Interfejs playlist API opiera się na instancjach MediaItem, które można wygodnie tworzyć za pomocą interfejsu MediaItem.Builder. W odtwarzaczu MediaItem jest przekształcany w odtwarzalny MediaSource przez MediaSource.Factory. Bez konfiguracji niestandardowej ta 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. Poniżej znajdziesz niektóre właściwości, które można ustawić dla elementów multimediów.

proste elementy multimedialne,

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

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 do aktualizowania interfejsu aplikacji podczas przełączania się 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. Więcej informacji o filmach poklatkowychbibliotekach ładowania 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 w przypadku multimediów adaptacyjnych

ExoPlayer udostępnia adaptacyjne źródła multimediów dla DASH, HLS i SmoothStreaming. Jeśli adres URI takiego elementu multimedialnego dostosowującego się do urządzenia kończy się standardowym rozszerzeniem pliku, odpowiedni źródło multimediów jest tworzone automatycznie. Jeśli URI ma niestandardowe rozszerzenie lub nie ma go wcale, typ MIME można ustawić wprost, 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. Właściwość UUID jest wymagana, a pozostałe właściwości są opcjonalne.

Przykład konfiguracji do odtwarzania elementu chronionego za pomocą DRM Widevine, w którym identyfikator URI licencji nie jest dostępny bezpośrednio w mediach (np. na playliście DASH) i wymagane są liczne sesje (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();

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 używa MergingMediaSource, aby połączyć źródło multimediów treści z SingleSampleMediaSource dla każdej ścieżki napisów. DefaultMediaSourceFactory nie obsługuje sideloadowania napisów w przypadku DASH wielookresowego.

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. Aby dowiedzieć się więcej, zapoznaj się z dokumentacją Javadoc MediaItem.Builder.

Wstawianie reklam

Aby wstawić reklamy, należy ustawić właściwość URI tagu reklamy w elemencie multimedialnym:

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, w odtwarzaczu musisz też odpowiednio skonfigurować DefaultMediaSourceFactory.