Uso de pistas multimedia

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

Un objeto GCKMediaTrack representa una pista. Consiste en un identificador numérico único y otros atributos, como ID de contenido y 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 varias transmisiones de audio alternativas (para idiomas diferentes). 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 los medios al 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];

Activa una o más pistas asociadas con el elemento multimedia (después de cargar el contenido multimedia) llamando a -[setActiveTrackIDs:] en GCKRemoteMediaClient y pasando los ID 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 nulo. El siguiente código inhabilita la pista de subtítulos.

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

Cómo dar estilo a las pistas de texto

La clase GCKMediaTextTrackStyle encapsula la información de estilo de una pista de texto. Se puede aplicar un estilo de pista al elemento multimedia que se está reproduciendo actualmente llamando a -[GCKRemoteMediaClient setTextTrackStyle]. El estilo de seguimiento creado en el código que aparece a continuación convierte el texto en rojo (FF) con una opacidad del 50% (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 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 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 mediante la configuración que proporciona el sistema o la propia app. Se proporciona un estilo predeterminado (en iOS 7 y versiones posteriores), que se puede recuperar a través del método estático +[GCKMediaTextTrackStyle createDefault]. Puedes cambiar los siguientes elementos de estilo de pista de texto:

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

Recibir actualizaciones de estado

Cuando hay varios remitentes conectados al mismo receptor, es importante que cada uno conozca los cambios en el receptor, incluso si esos cambios se iniciaron desde otros remitentes.

Para garantizar que el remitente reciba actualizaciones de estado del receptor, tu app debe registrar un GCKRemoteMediaClientListener. Si el GCKMediaTextTrackStyle de los medios actuales cambia, 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 de receptor no verifica si el estilo nuevo es diferente del anterior y notifica a todos los remitentes conectados de todas formas. Sin embargo, si se actualiza la lista de segmentos activos, solo se notificará al -[remoteMediaClient:didUpdateMediaStatus:] en los remitentes conectados.

Satisface los requisitos de CORS

Para la transmisión de contenido multimedia adaptable, Google Cast requiere la presencia de encabezados de CORS, pero incluso las transmisiones de medios mp4 simples requieren CORS si incluyen pistas. Si deseas habilitar las pistas para cualquier contenido multimedia, debes habilitar el CORS en tus transmisiones de pistas y de medios. Por lo tanto, si no tienes encabezados de CORS disponibles para tus medios mp4 simples en tu servidor y luego agregas una pista de subtítulos simple, no podrás transmitir tu contenido multimedia a menos que actualices tu servidor para incluir el encabezado de 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 encabezados adicionales que quizás no necesites antes.