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:
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 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:
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 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.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[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.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[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.
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 muestra para realizar 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 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.