Usar faixas de mídia

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:

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();

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.

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();

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:

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());
        }
    });

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:

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());
        }
    });

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:

Kotlin
.
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
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:

Kotlin
.
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
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:

Kotlin
.
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
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.