Cómo usar pistas multimedia

Un segmento de medios puede ser un objeto de transmisión de audio o video, o un objeto de texto (subtítulo).

Un objeto GCKMediaTrack representa un segmento. Consta de un identificador numérico único y otros atributos, como un ID de contenido y un título. Una instancia de GCKMediaTrack se puede crear de la siguiente manera:

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

Un elemento multimedia puede tener varias pistas; por ejemplo, puede tener varios subtítulos (cada uno para un idioma diferente) o varios flujos de audio alternativos (para diferentes idiomas). GCKMediaInformation es la clase que representa un elemento multimedia. Para asociar una colección de objetos GCKMediaTrack con un elemento multimedia, tu app debe actualizar su propiedad mediaTracks. Tu app debe realizar esta asociación antes de cargar el contenido multimedia en el receptor, como se muestra en el siguiente 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];

Activa uno o más segmentos asociados con el elemento multimedia (después de que se cargue el contenido multimedia) llamando a -[setActiveTrackIDs:] en GCKRemoteMediaClient y pasando los IDs de los segmentos que se activarán. Por ejemplo, el siguiente código activa la pista de subtítulos creada anteriormente.

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

Para desactivar un segmento en el elemento multimedia actual, llama a -[setActiveTrackIDs:] en GCKRemoteMediaClient con un array vacío o nulo. El siguiente código inhabilita el segmento de subtítulos.

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

Cómo aplicar estilo a las pistas de texto

La clase GCKMediaTextTrackStyle encapsula la información de estilo de un segmento de texto. Se puede aplicar un diseño de pista al elemento multimedia que se está reproduciendo llamando a -[GCKRemoteMediaClient setTextTrackStyle]. El estilo de pista creado en el siguiente código hace que el texto se muestre en rojo (FF) con un 50% de opacidad (80) y establece una fuente serif.

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;

Puedes usar el objeto GCKRequest que se devolvió para hacer un seguimiento de esta solicitud.

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

Consulta las actualizaciones de estado a continuación para obtener más información. Las apps deben permitir que los usuarios actualicen el estilo de los subtítulos, ya sea con la configuración que proporciona el sistema o la propia app. Se proporciona un diseño predeterminado que se puede recuperar a través del método estático +[GCKMediaTextTrackStyle createDefault]. Se pueden cambiar los siguientes elementos de estilo de la pista de texto:

  • Color y opacidad del primer plano (texto)
  • Color de fondo y opacidad
  • Tipo de borde
  • Color de borde
  • Ajuste de la fuente
  • Familia de fuentes
  • Estilo de fuente

Recibe actualizaciones de estado

Cuando varios emisores están conectados al mismo receptor, es importante que cada emisor conozca los cambios en el receptor, incluso si esos cambios se iniciaron desde otros emisores.

Para garantizar que el remitente reciba actualizaciones de estado del receptor, tu app debe registrar un GCKRemoteMediaClientListener. Si cambia el GCKMediaTextTrackStyle del contenido multimedia actual, se notificará a todos los remitentes conectados a través de las devoluciones de llamada -[remoteMediaClient:didUpdateMediaMetadata:] y -[remoteMediaClient:didUpdateMediaStatus:]. En este caso, el SDK del receptor no verifica si el nuevo diseño es diferente del anterior y notifica a todos los remitentes conectados de todos modos. Sin embargo, si se actualiza la lista de pistas activas, solo se notificará el -[remoteMediaClient:didUpdateMediaStatus:] en los emisores conectados.

Cumple con los requisitos de CORS

Para la transmisión de medios adaptable, Google Cast requiere la presencia de encabezados de CORS, pero incluso las transmisiones de medios mp4 simples requieren CORS si incluyen pistas. Si quieres habilitar pistas para cualquier contenido multimedia, debes habilitar CORS para tus transmisiones de pistas y de contenido multimedia. Por lo tanto, si no tienes encabezados CORS disponibles para tu contenido multimedia mp4 simple en tu servidor y, luego, agregas un segmento de subtítulos simple, no podrás transmitir tu contenido multimedia, a menos que actualices tu servidor para incluir el encabezado CORS adecuado. Además, debes permitir al menos los siguientes encabezados: Content-Type, Accept-Encoding y Range. Ten en cuenta que los dos últimos encabezados son adicionales y es posible que no los hayas necesitado antes.