MediaTrack
representa uma faixa de mídia, que pode ser um stream de áudio, de vídeo ou de texto
(como legendas ou closed caption). Seu app pode agrupar, estilizar e ativar
faixas de mídia.
Configurar uma faixa
É possível configurar uma faixa e atribuir um ID exclusivo a ela. O código a seguir cria uma faixa de texto em inglês, uma faixa de texto em francês e uma faixa de áudio em francês, cada um com seu próprio 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();
Faixas do grupo
É possível agrupar várias faixas em um item de mídia, que é representado por
MediaInfo
Uma instância de MediaInfo
usa uma matriz de faixas e agrega outras informações sobre o item de mídia.
Com base no exemplo, o app pode adicionar essas três faixas de mídia a uma campanha
item passando uma lista dessas três faixas para
MediaInfo.Builder.setMediaTracks(List)
Seu app precisa associar faixas em um MediaInfo
dessa maneira antes de carregar.
a mídia para o receptor.
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();
Remover faixas
Para remover todas as faixas da mídia atual (por exemplo, desativar as três
legendas no exemplo), chame
MediaInfo.Builder.setMediaTracks(List)
e passar uma lista vazia de IDs.
Atualizar faixas
O app pode ativar uma ou mais faixas associadas à mídia
(após o carregamento da mídia), chamando
RemoteMediaClient.setActiveMediaTracks(long[])
e passando os IDs das faixas a serem ativadas. Esse exemplo ativa o
Legenda e áudio em francês:
// 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()); } });
Estilizar faixas de texto
TextTrackStyle
encapsula as informações de estilo de uma faixa de texto. Depois de criar ou atualizar
um TextTrackStyle existente, você poderá aplicar esse estilo ao elemento
item de mídia chamando
RemoteMediaClient.setTextTrackStyle
,
assim:
// 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()); } });
Seu app precisa permitir que os usuários atualizem o estilo das faixas de texto usando as configurações fornecidas pelo sistema ou pelo próprio aplicativo. No Android KitKat e mais tarde, é possível usar as configurações de legenda do sistema fornecidas pelo estrutural:
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
Para versões anteriores ao KitKat, a chamada acima retornará um objeto cujo são indefinidos, então você precisa preenchê-los em seu aplicativo, com base sobre seleções de usuários e alguns valores padrão. Você pode estilizar o texto a seguir elementos de estilo de faixa:
- Cor e opacidade do primeiro plano (texto)
- Cor e opacidade de segundo plano
- Tipo de borda
- Cor da borda
- Escala da fonte
- Família de fontes
- Estilo da fonte
Por exemplo, defina a cor do texto como vermelho (FF) com 50% de opacidade (80) da seguinte maneira:
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
No KitKat e nas versões mais recentes, registre seu app para receber uma notificação
quando as configurações de legenda em todo o sistema forem atualizadas. Para isso, você precisa
implementar
CaptioningManager.CaptioningChangeListener
no seu app e registre esse listener chamando:
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
Quando seu aplicativo recebe uma chamada de retorno informando que as configurações de legenda foram alteradas, você
precisaria extrair as novas configurações e atualizar o estilo do texto
legenda para a mídia em reprodução chamando
RemoteMediaClient.setTextTrackStyle
e transmitir o novo estilo.
Receber atualizações de status
Quando vários remetentes estão conectados ao mesmo destinatário, é importante que que cada remetente esteja ciente das alterações no destinatário, mesmo que elas foram iniciadas por outros remetentes.
Para isso, seu aplicativo deve registrar um
RemoteMediaClient.Listener
e um
RemoteMediaClient.ProgressListener
Se o
TextTrackStyle
das alterações de mídia atuais, todos os remetentes conectados serão notificados
usando os dois listeners registrados acima. Nesse caso, o SDK do receptor
não verifica se o novo estilo é diferente do anterior e
notifica todos os remetentes conectados. Se, no entanto, o status
ativos rastreiam alterações, apenas o RemoteMediaClient.ProgressListener
em
os remetentes conectados serão notificados.
Atender aos requisitos do CORS
Para streaming de mídia adaptável, o Google Cast exige a presença de cabeçalhos CORS, mas até arquivos MP4 simples streams de mídia exigirão CORS se incluírem faixas. Se você quiser ativar o recurso para qualquer mídia, é necessário ativar o CORS para os streams de faixa e o córregos. Se você não tiver cabeçalhos CORS disponíveis para sua mídia mp4 simples e adicionar uma faixa de legenda simples, não será possível para transmitir sua mídia, a menos que você atualize seu servidor para incluir as CORS. Além disso, é necessário permitir pelo menos os seguintes cabeçalhos: Content-Type, Accept-Encoding e Range. Os dois últimos cabeçalhos são cabeçalhos adicionais que podem não ser necessários anteriormente.