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:
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()
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.
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()
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:
// 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 ) } })
// 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:
// 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 ) } })
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:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
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:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
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:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
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.