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