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:
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)
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:
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()
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.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[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.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[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.
let textTrackStyle = GCKMediaTextTrackStyle.createDefault() textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080") textTrackStyle.fontFamily = "serif" styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle) styleChangeRequest?.delegate = self
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.
// MARK: - GCKRequestDelegate func requestDidComplete(_ request: GCKRequest) { if request == styleChangeRequest { print("Style update completed.") styleChangeRequest = nil } }
#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.