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 legenda).

Um objeto GCKMediaTrack representa uma faixa. Ela consiste em um identificador numérico exclusivo e outros atributos, como ID e título do conteúdo. Uma instância de 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, pode ter várias legendas (cada uma para um idioma diferente) ou vários streams 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, o app precisa atualizar a propriedade mediaTracks. O app precisa fazer essa associação antes de carregar a mídia no receptor, como neste código:

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];

Para ativar uma ou mais faixas associadas ao item de mídia (depois que a mídia for carregada), chame -[setActiveTrackIDs:] em GCKRemoteMediaClient e transmita 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 nulo. 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, na sigla em inglês) com 50% de opacidade (80) e define uma fonte com serifa.

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;

É possível 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;
  }
}

Consulte as 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 (no iOS 7 e versões posteriores), que pode ser recuperado por meio do método estático +[GCKMediaTextTrackStyle createDefault]. É possível alterar os seguintes elementos de estilo das faixas de texto:

  • 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

Receber atualizações de status

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

Para garantir que o remetente receba atualizações de status do receptor, o 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 mesmo assim. 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 incluem Tracks. Se você quiser ativar as faixas para qualquer mídia, precisará ativar o CORS para os streams 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 vai ser possível transmitir a mídia, a menos que você atualize o servidor para incluir o cabeçalho CORS apropriado. Além disso, é necessário permitir pelo menos os seguintes cabeçalhos: Content-Type, Accept-Encoding e Range. Observe que os dois últimos cabeçalhos são cabeçalhos adicionais que você pode não ter necessário anteriormente.