Utilizza tracce multimediali

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

Configura un canale

Puoi configurare un canale e assegnargli un ID univoco. Il seguente codice crea una traccia di testo in inglese, una traccia di testo in francese e una traccia audio in 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();

Traccia gruppi

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

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 dal contenuto multimediale corrente (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. In questo esempio vengono attivati i sottotitoli in francese e l'audio in 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 incapsula le informazioni sugli stili di una traccia di testo. Dopo aver creato o aggiornato un TextTrackStyle esistente, puoi applicarlo 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 Marshmallow e versioni successive, puoi utilizzare le impostazioni dei 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 Lollipop, la chiamata precedente restituirà un oggetto i cui campi non sono definiti, quindi devi compilare questi campi nella tua app in base alle selezioni dell'utente e ad alcuni valori predefiniti. Puoi applicare uno stile ai seguenti elementi di stile delle tracce di testo:

  • Colore e opacità del primo piano
  • Colore dello sfondo e opacità
  • Tipo di bordo
  • Colore bordo
  • Scala di caratteri
  • Famiglia di caratteri
  • Stile carattere

Ad esempio, imposta il colore del testo su rosso (FF) con un'opacità del 50% (80) come segue:

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

In Lollipop e versioni successive, devi registrare la tua app per ricevere una notifica quando le impostazioni dei sottotitoli a livello di sistema vengono aggiornate. A questo scopo, devi implementare CaptioningManager.CaptioningChangeListener nella tua app e registrare questo listener chiamando:

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

Quando la tua app riceve una chiamata in cui ti informa che le impostazioni dei sottotitoli sono cambiate, devi estrarre le nuove impostazioni e aggiornare lo stile dei sottotitoli codificati per i contenuti multimediali attualmente in riproduzione chiamando RemoteMediaClient.setTextTrackStyle e trasmettendo il nuovo stile.

Ricevi aggiornamenti sullo stato

Quando più mittenti sono connessi allo stesso destinatario, è importante che ciascun mittente sia a conoscenza delle modifiche apportate al destinatario anche se tali modifiche sono state avviate da altri mittenti.

A questo scopo, la tua app deve registrare un RemoteMediaClient.Listener e un RemoteMediaClient.ProgressListener.

Se il valore TextTrackStyle dei contenuti multimediali correnti cambia, tutti i mittenti connessi riceveranno una notifica tramite entrambi i listener registrati sopra. In questo caso, l'SDK del destinatario non verifica se il nuovo stile è diverso da quello precedente e invia una notifica a tutti i mittenti connessi. Se, tuttavia, lo stato dei canali attivi cambia, verrà inviata una notifica solo al RemoteMediaClient.ProgressListener nei mittenti connessi.

Soddisfa i requisiti CORS

Per lo streaming di contenuti multimediali adattivi, Google Cast richiede la presenza di intestazioni CORS, ma anche i semplici stream di contenuti mp4 richiedono il protocollo CORS se includono le tracce. Se vuoi abilitare le tracce per qualsiasi supporto multimediale, devi abilitare CORS sia per i flussi di monitoraggio che per quelli multimediali. Pertanto, se sul server non disponi di intestazioni CORS per i tuoi contenuti multimediali mp4 semplici e poi aggiungi una semplice traccia di sottotitoli, non potrai trasmettere in streaming i tuoi contenuti multimediali a meno che non aggiorni il server in modo da includere l'intestazione CORS appropriata. Inoltre, devi consentire almeno le seguenti intestazioni: Content-Type, Accept-Encoding e Range. Tieni presente che le ultime due intestazioni sono altre intestazioni che in precedenza potrebbero non essere state necessarie.