Como usar faixas de mídia

Uma faixa de mídia pode ser um objeto de stream de áudio ou vídeo ou um objeto de texto (legenda ou descrição).

Um objeto GCKMediaTrack representa uma faixa. Ele consiste em um identificador numérico exclusivo e outros atributos, como um ID e um título de conteúdo. Uma instância GCKMediaTrack pode ser criada da seguinte maneira:

Swift
let captionsTrack = GCKMediaTrack.init(identifier: 1,
                                       contentIdentifier: "https://some-url/caption_en.vtt",
                                       contentType: "text/vtt",
                                       type: GCKMediaTrackType.text,
                                       textSubtype: GCKMediaTextTrackSubtype.captions,
                                       name: "English Captions",
                                       languageCode: "en",
                                       customData: nil)
Objective-C
GCKMediaTrack *captionsTrack =
      [[GCKMediaTrack alloc] initWithIdentifier:1
                              contentIdentifier:@"https://some-url/caption_en.vtt"
                                    contentType:@"text/vtt"
                                           type:GCKMediaTrackTypeText
                                    textSubtype:GCKMediaTextTrackSubtypeCaptions
                                           name:@"English Captions"
                                   languageCode:@"en"
                                     customData:nil];

Um item de mídia pode ter várias faixas. Por exemplo, ele pode ter várias legendas (cada uma para um idioma diferente) ou vários fluxos de áudio alternativos (para idiomas diferentes). GCKMediaInformation é a classe que representa um item de mídia. Para associar uma coleção de objetos GCKMediaTrack a um item de mídia, seu app precisa atualizar a propriedade mediaTracks. O app precisa fazer essa associação antes de carregar a mídia para o receptor, como no código a seguir:

Swift
let tracks = [captionsTrack]

let url = URL.init(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")
guard let mediaURL = url else {
  print("invalid mediaURL")
  return
}

let mediaInfoBuilder = GCKMediaInformationBuilder.init(contentURL: mediaURL)
mediaInfoBuilder.streamType = GCKMediaStreamType.none;
mediaInfoBuilder.contentType = "video/mp4"
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
mediaInformation = mediaInfoBuilder.build()
Objective-C
NSArray *tracks = @[captionsTrack];

GCKMediaInformationBuilder *mediaInfoBuilder =
  [[GCKMediaInformationBuilder alloc] initWithContentURL:
   [NSURL URLWithString:@"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"]];
mediaInfoBuilder.streamType = GCKMediaStreamTypeNone;
mediaInfoBuilder.contentType = @"video/mp4";
mediaInfoBuilder.metadata = metadata;
mediaInfoBuilder.mediaTracks = tracks;
self.mediaInformation = [mediaInfoBuilder build];

Ative uma ou mais faixas associadas ao item de mídia (depois que a mídia for carregada) chamando -[setActiveTrackIDs:] em GCKRemoteMediaClient e transmitindo os IDs das faixas a serem ativadas. Por exemplo, o código a seguir ativa a faixa de legendas criada acima.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

Para desativar uma faixa no item de mídia atual, chame -[setActiveTrackIDs:] em GCKRemoteMediaClient com uma matriz vazia ou nula. O código a seguir desativa a faixa de legendas.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

Estilizar faixas de texto

A classe GCKMediaTextTrackStyle encapsula as informações de estilo de uma faixa de texto. Um estilo de faixa pode ser aplicado ao item de mídia em reprodução chamando -[GCKRemoteMediaClient setTextTrackStyle]. O estilo de faixa criado no código abaixo deixa o texto vermelho (FF) com 50% de opacidade (80) e define uma fonte serifada.

Swift
let textTrackStyle = GCKMediaTextTrackStyle.createDefault()
textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080")
textTrackStyle.fontFamily = "serif"
styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle)
styleChangeRequest?.delegate = self
Objective-C
GCKMediaTextTrackStyle *textTrackStyle = [GCKMediaTextTrackStyle createDefault];
[textTrackStyle setForegroundColor:[[GCKColor alloc] initWithCSSString:@"#FF000080"]];
[textTrackStyle setFontFamily:@"serif"];
self.styleChangeRequest = [self.sessionManager.currentSession.remoteMediaClient setTextTrackStyle:textTrackStyle];
self.styleChangeRequest.delegate = self;

Você pode usar o objeto GCKRequest retornado para rastrear essa solicitação.

Swift
// MARK: - GCKRequestDelegate

func requestDidComplete(_ request: GCKRequest) {
  if request == styleChangeRequest {
    print("Style update completed.")
    styleChangeRequest = nil
  }
}
Objective-C
#pragma mark - GCKRequestDelegate

- (void)requestDidComplete:(GCKRequest *)request {
  if (request == self.styleChangeRequest) {
    NSLog(@"Style update completed.");
    self.styleChangeRequest = nil;
  }
}

Confira Atualizações de status abaixo para mais informações. Os apps precisam permitir que os usuários atualizem o estilo das faixas de texto usando as configurações fornecidas pelo sistema ou pelo próprio app. Há um estilo padrão fornecido, que pode ser recuperado pelo método estático +[GCKMediaTextTrackStyle createDefault]. É possível mudar os seguintes elementos de estilo da faixa de texto:

  • Cor e opacidade do primeiro plano (texto)
  • Cor e opacidade de segundo plano
  • Tipo de borda
  • Cor da borda
  • Ajuste da fonte
  • Família de fontes
  • Estilo da fonte

Receber atualizações de status

Quando vários remetentes estão conectados ao mesmo receptor, é importante que cada um deles esteja ciente das mudanças no receptor, mesmo que elas tenham sido iniciadas por outros remetentes.

Para garantir que o remetente receba atualizações de status do destinatário, seu app precisa registrar um GCKRemoteMediaClientListener. Se o GCKMediaTextTrackStyle da mídia atual mudar, todos os remetentes conectados serão notificados pelos callbacks -[remoteMediaClient:didUpdateMediaMetadata:] e -[remoteMediaClient:didUpdateMediaStatus:]. Nesse caso, o SDK do receptor não verifica se o novo estilo é diferente do anterior e notifica todos os remetentes conectados, independente disso. No entanto, se a lista de faixas ativas for atualizada, apenas o -[remoteMediaClient:didUpdateMediaStatus:] nos remetentes conectados será notificado.

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é mesmo streams de mídia mp4 simples exigem CORS se incluírem faixas. Se você quiser ativar faixas para qualquer mídia, habilite o CORS para os fluxos de faixas e de mídia. Portanto, se você não tiver cabeçalhos CORS disponíveis para sua mídia mp4 simples no servidor e adicionar uma faixa de legenda simples, não será possível transmitir a mídia, a menos que você atualize o servidor para incluir o cabeçalho CORS adequado. 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 adicionais e talvez não tenham sido necessários antes.