Utiliser des pistes multimédias

MediaTrack représente une piste multimédia, qui peut être un flux audio, un flux vidéo ou du texte (par exemple, des sous-titres). Votre application peut regrouper, styliser et activer des pistes multimédias.

Configurer un canal

Vous pouvez configurer un canal et lui attribuer un identifiant unique. Le code suivant crée une piste de texte en anglais, une piste de texte en français et une piste audio en français, chacune avec son propre ID:

Kotlin
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT)
    .setName("English Subtitle")
    .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
    .setContentId("https://some-url/caption_en.vtt")
    /* language is required for subtitle type but optional otherwise */
    .setLanguage("en-US")
    .build()

val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT)
    .setName("French Subtitle")
    .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
    .setContentId("https://some-url/caption_fr.vtt")
    .setLanguage("fr")
    .build()

val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO)
    .setName("French Audio")
    .setContentId("trk0001")
    .setLanguage("fr")
    .build()
Java
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */,
MediaTrack.TYPE_TEXT)
  .setName("English Subtitle")
  .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
  .setContentId("https://some-url/caption_en.vtt")
  /* language is required for subtitle type but optional otherwise */
  .setLanguage("en-US")
  .build();

MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT)
  .setName("French Subtitle")
  .setSubtype(MediaTrack.SUBTYPE_SUBTITLES)
  .setContentId("https://some-url/caption_fr.vtt")
  .setLanguage("fr")
  .build();

MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO)
  .setName("French Audio")
  .setContentId("trk0001")
  .setLanguage("fr")
  .build();

Titres de groupe

Vous pouvez regrouper plusieurs pistes dans un élément multimédia, représenté par MediaInfo. Une instance de MediaInfo utilise un tableau de pistes et regroupe d'autres informations sur l'élément multimédia. Sur la base de l'exemple ci-dessus, votre application peut ajouter ces trois pistes multimédias à un élément multimédia en transmettant une liste de ces trois pistes dans MediaInfo.Builder.setMediaTracks(List). Votre application doit associer les pistes à un MediaInfo de cette manière avant de charger le contenu multimédia dans le récepteur.

Kotlin
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>()
tracks.add(englishSubtitle)
tracks.add(frenchSubtitle)
tracks.add(frenchAudio)
val mediaInfo = MediaInfo.Builder(url)
    .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
    .setContentType(getContentType())
    .setMetadata(getMetadata())
    .setMediaTracks(tracks)
    .build()
Java
List tracks = new ArrayList();
tracks.add(englishSubtitle);
tracks.add(frenchSubtitle);
tracks.add(frenchAudio);
MediaInfo mediaInfo = MediaInfo.Builder(url)
  .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED)
  .setContentType(getContentType())
  .setMetadata(getMetadata())
  .setMediaTracks(tracks)
  .build();

Supprimer les canaux

Pour supprimer toutes les pistes du contenu multimédia actuel (par exemple, en désactivant les trois sous-titres dans l'exemple), appelez MediaInfo.Builder.setMediaTracks(List) et transmettez une liste d'ID vide.

Mettre à jour les titres

Votre application peut activer un ou plusieurs titres associés à l'élément multimédia (après le chargement du contenu multimédia) en appelant RemoteMediaClient.setActiveMediaTracks(long[]) et en transmettant les ID des pistes à activer. Dans cet exemple, les sous-titres et l'audio en français sont activés:

Kotlin
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3))
    .setResultCallback(ResultCallback {
            mediaChannelResult: RemoteMediaClient.MediaChannelResult ->
                if (!mediaChannelResult.status.isSuccess) {
                    Log.e(TAG, "Failed with status code:" +
                            mediaChannelResult.status.statusCode
                    )
                }
    })
Java
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setActiveMediaTracks(new long[]{2, 3})
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed with status code:" +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

Appliquer un style aux pistes de texte

TextTrackStyle encapsule les informations de style d'une piste de texte. Après avoir créé ou mis à jour un TextTrackStyle existant, vous pouvez appliquer ce style à l'élément multimédia en cours de lecture en appelant RemoteMediaClient.setTextTrackStyle, comme suit:

Kotlin
// the ID for the French subtitle is '2' and for the French audio '3'
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(ResultCallback {
            mediaChannelResult: RemoteMediaClient.MediaChannelResult ->
                if (!mediaChannelResult.status.isSuccess) {
                    Log.e(TAG, "Failed to set the style, status code: " +
                            mediaChannelResult.status.statusCode
                    )
                }
    })
Java
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed to set the style, status code: " +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

Votre application doit permettre aux utilisateurs de mettre à jour le style des pistes de texte à l'aide des paramètres fournis par le système ou par l'application elle-même. Dans Android KitKat et versions ultérieures, vous pouvez utiliser les paramètres de sous-titres du système fournis par le framework:

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

Pour les versions antérieures à KitKat, l'appel ci-dessus renvoie un objet dont les champs ne sont pas définis. Vous devez donc les renseigner dans votre application, en fonction des sélections de l'utilisateur et de certaines valeurs par défaut. Vous pouvez styliser les éléments de style de piste de texte suivants:

  • Couleur et opacité du premier plan (texte)
  • Couleur et opacité de l'arrière-plan
  • Type de contour
  • Couleur du contour
  • Échelle de police
  • Famille de polices
  • Style de police

Par exemple, définissez la couleur du texte sur rouge (FF) avec une opacité de 50 % (80), comme suit:

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

Sous KitKat et les versions ultérieures, vous devez enregistrer votre application pour être averti lorsque les paramètres de sous-titres du système sont mis à jour. À cette fin, vous devez implémenter CaptioningManager.CaptioningChangeListener dans votre application et enregistrer cet écouteur en appelant:

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

Lorsque votre application reçoit un rappel indiquant que les paramètres des sous-titres ont été modifiés, vous devez extraire les nouveaux paramètres et mettre à jour le style des sous-titres du contenu multimédia en cours de lecture en appelant RemoteMediaClient.setTextTrackStyle et en transmettant le nouveau style.

Recevoir des informations sur l'état de la réparation

Lorsque plusieurs expéditeurs sont connectés au même destinataire, il est important que chacun d'eux soit informé des modifications apportées au destinataire, même si celles-ci ont été effectuées par d'autres expéditeurs.

À cette fin, votre application doit enregistrer un RemoteMediaClient.Listener et un RemoteMediaClient.ProgressListener.

Si le TextTrackStyle du contenu multimédia actuel change, tous les expéditeurs connectés seront avertis via les deux écouteurs enregistrés ci-dessus. Dans ce cas, le SDK récepteur ne vérifie pas si le nouveau style est différent du précédent et avertit tous les expéditeurs connectés. Toutefois, si l'état des canaux actifs change, seul le RemoteMediaClient.ProgressListener des expéditeurs connectés sera averti.

Répondre aux exigences CORS

Pour le streaming multimédia adaptatif, Google Cast nécessite la présence d'en-têtes CORS, mais même les flux multimédias mp4 simples nécessitent CORS s'ils incluent des pistes. Si vous souhaitez activer les pistes pour tous les contenus multimédias, vous devez activer le CORS pour vos flux de suivi et pour vos flux multimédias. Ainsi, si vous ne disposez pas d'en-têtes CORS pour votre fichier multimédia MP4 simple sur votre serveur et que vous ajoutez ensuite une piste de sous-titres simple, vous ne pourrez pas diffuser votre contenu multimédia, sauf si vous mettez à jour votre serveur pour inclure l'en-tête CORS approprié. En outre, vous devez autoriser au moins les en-têtes suivants : Content-Type, Accept-Encoding et Range. Notez que les deux derniers en-têtes sont des en-têtes supplémentaires dont vous n'aviez peut-être pas besoin auparavant.