Cómo usar pistas multimedia

Una pista multimedia puede ser un objeto de transmisión de audio o video, o bien un objeto de texto (subtítulo).

Un objeto GCKMediaTrack representa un segmento. Se compone de un identificador numérico único y otros atributos, como el ID de contenido y el título. Una instancia 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 varias transmisiones de audio alternativas (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 necesita hacer esta asociación antes de cargar el contenido multimedia en el receptor, como 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];

Para activar una o más pistas asociadas con el elemento multimedia (después de cargar el contenido multimedia), llama a -[setActiveTrackIDs:] en GCKRemoteMediaClient y pasa los IDs de las pistas 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 una pista en el elemento multimedia actual, llama a -[setActiveTrackIDs:] en GCKRemoteMediaClient con un array vacío o con nil. El siguiente código inhabilita la pista de subtítulos.

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

Aplica diseño a pistas de texto

La clase GCKMediaTextTrackStyle encapsula la información de estilo de una pista de texto. Para aplicar un estilo de pista al elemento multimedia que se está reproduciendo, llama a -[GCKRemoteMediaClient setTextTrackStyle]. El estilo de pista creado en el siguiente código cambia el texto a 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 muestra para realizar el 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 Actualizaciones de estado a continuación para obtener más información. Las apps deben permitir que los usuarios actualicen el estilo de las pistas de texto, ya sea con la configuración proporcionada por el sistema o la propia app. Se proporciona un estilo predeterminado (en iOS 7 y versiones posteriores), que se puede recuperar con el método estático +[GCKMediaTextTrackStyle createDefault]. Se pueden cambiar los siguientes elementos de estilo de seguimiento de texto:

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

Recibir actualizaciones de estado

Cuando se conectan varios remitentes al mismo receptor, es importante que cada uno esté al tanto de los cambios en el receptor, incluso si esos cambios los iniciaron desde otros remitentes.

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, todos los remitentes conectados recibirán una notificación a través de las devoluciones de llamada -[remoteMediaClient:didUpdateMediaMetadata:] y -[remoteMediaClient:didUpdateMediaStatus:]. En este caso, el SDK receptor no verifica si el estilo nuevo es diferente del anterior y notifica a todos los remitentes conectados de todos modos. Sin embargo, si se actualiza la lista de segmentos activos, solo se notificará a los -[remoteMediaClient:didUpdateMediaStatus:] de los remitentes conectados.

Cumple con los requisitos de CORS

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