Usa tracce multimediali

MediaTrack rappresenta una traccia multimediale, che può essere uno stream audio, un video stream o un testo (come i sottotitoli o i sottotitoli codificati). L'app può raggruppare, applicare stili e attivare tracce multimediali.

Configura una traccia

Puoi configurare una traccia e assegnarvi un ID univoco. Il codice riportato di seguito crea una traccia di testo in inglese, una traccia di testo francese e una traccia audio francese, ciascuna con il proprio 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();

Gruppo di tracce

Puoi raggruppare più tracce in un elemento multimediale, che è rappresentato da MediaInfo. Un'istanza di MediaInfo prende un array di tracce e aggrega altre informazioni sull'elemento multimediale. Partendo dall'esempio, la tua app può aggiungere queste tre tracce multimediali a un elemento multimediale trasmettendo un elenco di queste tre tracce in MediaInfo.Builder.setMediaTracks(List). La tua app deve associare le tracce in un MediaInfo in questo modo prima di caricare i contenuti multimediali sul ricevitore.

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();

Rimuovi gruppi

Per rimuovere tutte le tracce dai contenuti multimediali correnti (ad esempio disattivando i tre sottotitoli nell'esempio), chiama MediaInfo.Builder.setMediaTracks(List) e trasmetti un elenco vuoto di ID.

Aggiorna tracce

La tua app può attivare una o più tracce associate all'elemento multimediale (dopo il caricamento dei contenuti multimediali), chiamando RemoteMediaClient.setActiveMediaTracks(long[]) e trasmettendo gli ID delle tracce da attivare. Questo esempio attiva il sottotitolo e l'audio francese:

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());
        }
    });

Applicare uno stile alle tracce di testo

TextTrackStyle racchiude le informazioni sullo stile di una traccia di testo. Dopo aver creato o aggiornato uno TextTrackStyle esistente, puoi applicare tale stile all'elemento multimediale attualmente in riproduzione chiamando RemoteMediaClient.setTextTrackStyle, in questo modo:

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());
        }
    });

L'app deve consentire agli utenti di aggiornare lo stile delle tracce di testo utilizzando le impostazioni fornite dal sistema o dall'app stessa. In Android KitKat e versioni successive, puoi utilizzare le impostazioni di sottotitoli a livello di sistema fornite dal framework:

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

Per le versioni precedenti a KitKat, la chiamata precedente restituirà un oggetto i cui campi non sono definiti, pertanto devi completare questi campi nella tua app in base alle selezioni degli utenti e ad alcuni valori predefiniti. Puoi applicare uno stile ai seguenti elementi di stile del testo traccia:

  • Opacità e colore in primo piano (testo)
  • Colore dello sfondo e opacità
  • Tipo di bordo
  • Colore bordo
  • Scala carattere
  • Famiglia di caratteri
  • Stile carattere

Ad esempio, imposta il colore del testo su rosso (FF) con il 50% di opacità (80) nel seguente modo:

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

In KitKat e versioni successive, devi registrare l'app per ricevere una notifica quando vengono aggiornate le impostazioni dei sottotitoli codificati a livello di sistema. A questo scopo, devi implementare CaptioningManager.CaptioningChangeListener nell'app e registrare questo listener chiamando:

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

Dopo aver richiamato l'app dopo aver modificato le impostazioni dei sottotitoli, dovrai estrarre le nuove impostazioni e aggiornare lo stile dei sottotitoli di testo per i contenuti multimediali attualmente in riproduzione chiamando RemoteMediaClient.setTextTrackStyle e passando al nuovo stile.

Ricevi aggiornamenti sullo stato

Quando più mittenti sono connessi allo stesso ricevitore, è importante che ogni mittente sappia quali sono le modifiche effettuate dal destinatario, anche se sono state avviate da altri mittenti.

A questo scopo, la tua app deve registrare una proprietà RemoteMediaClient.Listener e una RemoteMediaClient.ProgressListener.

Se il valore TextTrackStyle degli elementi multimediali correnti cambia, tutti i mittenti collegati riceveranno una notifica tramite entrambi gli ascoltatori registrati sopra. In questo caso, l'SDK del destinatario non verifica se il nuovo stile è diverso da quello precedente e notifica tutti i mittenti connessi. Se, tuttavia, lo stato delle tracce attive cambia, verrà inviata una notifica solo a RemoteMediaClient.ProgressListener nei mittenti collegati.

Soddisfa i requisiti CORS

Per lo streaming di contenuti multimediali adattivo, Google Cast richiede la presenza di intestazioni CORS, ma anche i semplici stream multimediali mp4 richiedono CORS se includono tracce. Se vuoi abilitare le tracce per tutti i contenuti multimediali, devi attivare CORS sia per i flussi di tracce sia per gli stream multimediali. Pertanto, se sul tuo server non sono disponibili intestazioni CORS per il tuo supporto multimediale mp4 e aggiungi una traccia di sottotitoli semplice, non potrai trasmettere in streaming i contenuti multimediali a meno che non aggiorni il server in modo da includere l'intestazione CORS appropriata. Inoltre, devi consentire almeno le seguenti intestazioni: Contenuto-Tipo, Accetta-codifica e Intervallo. Tenete presente che le ultime due intestazioni sono intestazioni aggiuntive che potreste non aver bisogno in precedenza.