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:
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();
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.
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 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:
// 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
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:
// 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 Marshmallow e versioni successive, puoi utilizzare le impostazioni dei sottotitoli a livello di sistema fornite dal framework:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
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:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
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:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
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.