Utilizza tracce multimediali

MediaTrack rappresenta una traccia multimediale che può essere uno stream audio, uno stream video o del testo (come i sottotitoli o i sottotitoli codificati). La tua 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 in francese e una traccia audio in francese, ognuno 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();

Gruppi di tracce

Puoi raggruppare più tracce in un elemento multimediale, rappresentato da MediaInfo Un'istanza di MediaInfo prende un array di tracce e aggrega altre informazioni sull'elemento multimediale. Basandoti sull'esempio, la tua app può aggiungere queste tre tracce multimediali a un contenuto multimediale passando un elenco di queste tre tracce MediaInfo.Builder.setMediaTracks(List) La tua app deve associare in questo modo le tracce in un MediaInfo prima di caricarsi i contenuti multimediali al 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 dai contenuti multimediali correnti (ad esempio disattivando i tre sottotitoli nell'esempio), richiama MediaInfo.Builder.setMediaTracks(List) e trasmetti un elenco di ID vuoto.

Aggiorna tracce

La tua app può attivare una o più tracce associate ai contenuti multimediali dell'elemento (dopo il caricamento dell'elemento multimediale), richiamando RemoteMediaClient.setActiveMediaTracks(long[]) e passando gli ID delle tracce da attivare. Questo esempio attiva Sottotitolo in francese e 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());
        }
    });

Stili delle tracce di testo

TextTrackStyle contiene le informazioni sugli stili di una traccia di testo. Dopo la creazione o l'aggiornamento un TextTrackStyle esistente, puoi applicarlo allo stile attualmente in riproduzione l'elemento multimediale chiamando RemoteMediaClient.setTextTrackStyle, nel seguente 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 per le tracce di testo, utilizzando le impostazioni fornite dal sistema o dall'app stessa. In Android KitKat e in un secondo momento, puoi utilizzare le impostazioni dei sottotitoli codificati a livello di sistema fornite :

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

Per le versioni precedenti a KitKat, la chiamata riportata sopra restituirà un oggetto la cui non sono definiti, quindi devi compilarli nella tua app in base sulle selezioni degli utenti e su alcuni valori predefiniti. Puoi applicare uno stile al seguente testo Elementi dello stile del monitoraggio:

  • Colore e opacità del 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 un'opacità del 50% (80) nel seguente modo:

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

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

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

Quando l'app riceve una chiamata che ti informa che le impostazioni dei sottotitoli sono state modificate, deve estrarre le nuove impostazioni e aggiornare lo stile del testo per i contenuti multimediali attualmente in riproduzione chiamando RemoteMediaClient.setTextTrackStyle passando il nuovo stile.

Ricevi aggiornamenti sullo stato

Quando più mittenti sono connessi allo stesso destinatario, è importante che ogni mittente di essere a conoscenza dei cambiamenti nel destinatario anche se tali modifiche sono state avviate da altri mittenti.

A questo scopo, l'app deve registrare un RemoteMediaClient.Listener e un RemoteMediaClient.ProgressListener.

Se TextTrackStyle delle modifiche dei contenuti multimediali correnti, tutti i mittenti collegati riceveranno una notifica tramite entrambi gli ascoltatori registrati sopra. In questo caso, l'SDK ricevente non verifica se il nuovo stile è diverso da quello precedente invia una notifica a tutti i mittenti connessi. Se, invece, lo stato modifiche alle tracce attive, solo RemoteMediaClient.ProgressListener in i mittenti connessi riceveranno una notifica.

Soddisfa i requisiti CORS

Per lo streaming di contenuti multimediali adattivi, Google Cast richiede la presenza di CORS, ma anche un semplice file mp4 gli stream multimediali richiedono CORS se includono le tracce. Se vuoi attivare le tracce per tutti i contenuti multimediali, devi attivare CORS sia per gli stream traccia che per i contenuti multimediali i flussi di dati. Quindi, se non disponi di intestazioni CORS per i tuoi contenuti multimediali mp4 semplici sul tuo server e aggiungi una semplice traccia di sottotitoli, non potrai per trasmettere in streaming i tuoi contenuti multimediali a meno che non aggiorni il server in modo da includere i CORS. Inoltre, devi consentire almeno le seguenti intestazioni: Content-Type, Accept-Encoding e Range. Nota che le ultime due intestazioni intestazioni aggiuntive che in precedenza potrebbero non essere state necessarie.