Ścieżka multimedialna może być obiektem strumienia audio lub wideo albo obiektem tekstowym (napisy lub napisy kodowane).
Obiekt GCKMediaTrack reprezentuje ścieżkę. Składa się z unikalnego identyfikatora numerycznego i innych atrybutów, takich jak identyfikator treści i tytuł. Instancję GCKMediaTrack można utworzyć w ten sposób:
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];
Element multimedialny może mieć wiele ścieżek, np. wiele napisów (każde w innym języku) lub wiele alternatywnych strumieni audio (w różnych językach).
GCKMediaInformation
to klasa reprezentująca element multimedialny. Aby powiązać kolekcję obiektówGCKMediaTrack z elementem multimedialnym, aplikacja powinna zaktualizować właściwośćmediaTracks. Aplikacja musi utworzyć to powiązanie przed załadowaniem multimediów na odbiornik, jak w tym kodzie:
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];
Aktywuj co najmniej 1 ścieżkę powiązaną z elementem multimedialnym (po załadowaniu multimediów), wywołując -[setActiveTrackIDs:] na GCKRemoteMediaClient i przekazując identyfikatory ścieżek, które mają zostać aktywowane. Na przykład ten kod aktywuje ścieżkę napisów utworzoną powyżej.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];
Aby dezaktywować ścieżkę w bieżącym elemencie multimedialnym, wywołaj
-[setActiveTrackIDs:] on
GCKRemoteMediaClient
z pustą tablicą lub wartością nil. Poniższy kod wyłącza ścieżkę napisów.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];
Stylizowanie ścieżek tekstowych
Klasa
GCKMediaTextTrackStyle
zawiera informacje o stylu ścieżki tekstowej. Styl ścieżki można zastosować do aktualnie odtwarzanego elementu multimedialnego, wywołując funkcję -[GCKRemoteMediaClient
setTextTrackStyle].
Styl ścieżki utworzony w poniższym kodzie zmienia kolor tekstu na czerwony (FF) przy 50-procentowej przezroczystości (80) i ustawia czcionkę szeryfową.
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;
Do śledzenia tego żądania możesz użyć zwróconego obiektu GCKRequest.
// 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; } }
Więcej informacji znajdziesz w sekcji Aktualizacje stanu poniżej. Aplikacje powinny umożliwiać użytkownikom aktualizowanie stylu ścieżek tekstowych za pomocą ustawień udostępnianych przez system lub samą aplikację.
Dostępny jest styl domyślny, który można pobrać za pomocą metody statycznej +[GCKMediaTextTrackStyle
createDefault].
Możesz zmienić te elementy stylu ścieżki tekstowej:
- Kolor i przezroczystość pierwszego planu (tekstu)
- kolor i przezroczystość tła;
- Typ krawędzi
- Kolor krawędzi
- Skala czcionki
- Rodzina czcionek
- Styl czcionki
Otrzymywanie aktualizacji stanu
Gdy wielu nadawców jest połączonych z tym samym odbiorcą, ważne jest, aby każdy nadawca był świadomy zmian u odbiorcy, nawet jeśli zostały one zainicjowane przez innych nadawców.
Aby mieć pewność, że nadawca otrzymuje od odbiorcy aktualizacje stanu, aplikacja powinna zarejestrować GCKRemoteMediaClientListener.
Jeśli zmieni się
GCKMediaTextTrackStyle
bieżącego medium, wszystkie połączone urządzenia wysyłające otrzymają powiadomienie
za pomocą wywołań zwrotnych -[remoteMediaClient:didUpdateMediaMetadata:] i -[remoteMediaClient:didUpdateMediaStatus:]. W takim przypadku pakiet SDK odbiornika nie sprawdza, czy nowy styl różni się od poprzedniego, i powiadamia o tym wszystkich połączonych nadawców. Jeśli jednak lista aktywnych ścieżek zostanie zaktualizowana, powiadomienie otrzyma tylko -[remoteMediaClient:didUpdateMediaStatus:] w przypadku połączonych nadawców.
Spełnianie wymagań CORS
W przypadku adaptacyjnego przesyłania strumieniowego multimediów Google Cast wymaga obecności nagłówków CORS, ale nawet proste strumienie multimediów mp4 wymagają CORS, jeśli zawierają ścieżki. Jeśli chcesz włączyć ścieżki dla dowolnych multimediów, musisz włączyć CORS zarówno w przypadku strumieni ścieżek, jak i strumieni multimediów. Jeśli więc na serwerze nie masz nagłówków CORS dla prostego pliku mp4, a następnie dodasz prostą ścieżkę napisów, nie będziesz w stanie przesyłać strumieniowo multimediów, dopóki nie zaktualizujesz serwera, aby uwzględniał odpowiedni nagłówek CORS. Musisz też zezwolić na co najmniej te nagłówki: Content-Type, Accept-Encoding i Range. Pamiętaj, że ostatnie 2 nagłówki to dodatkowe nagłówki, które mogły nie być wcześniej potrzebne.