Korzystanie ze ścieżek multimedialnych

Ścieżka multimediów może być obiektem strumienia audio lub wideo albo obiektem tekstowym (napisem).

Obiekt GCKMediaTrack reprezentuje ścieżkę. Składa się z unikalnego identyfikatora liczbowego i innych atrybutów, np. identyfikatora treści i tytułu. Instancję GCKMediaTrack można utworzyć w następujący sposób:

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];

Element multimedialny może mieć wiele ścieżek, na przykład może mieć wiele napisów (każdy w innym języku) lub wiele alternatywnych strumieni audio (dla różnych języków). GCKMediaInformation to klasa reprezentująca element multimedialny. Aby powiązać kolekcję obiektów GCKMediaTrack z elementem multimedialnym, aplikacja powinna zaktualizować swoją właściwość mediaTracks. Aplikacja musi utworzyć to powiązanie, zanim wczyta multimedia do odbiornika, jak w tym kodzie:

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];

Aktywuj co najmniej jedną ścieżkę powiązaną z elementem multimedialnym (po wczytaniu multimediów), wywołując metodę -[setActiveTrackIDs:] na urządzeniu GCKRemoteMediaClient i przekazując identyfikatory ścieżek do aktywacji. Poniższy kod aktywuje na przykład utworzoną powyżej ścieżkę z napisami.

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

Aby dezaktywować ścieżkę w bieżącym elemencie multimedialnym, wywołaj -[setActiveTrackIDs:] na GCKRemoteMediaClient z pustą tablicą lub wartością nil. Poniższy kod wyłącza ścieżkę z napisami.

Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Objective-C
[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 metodę -[GCKRemoteMediaClient setTextTrackStyle]. Styl ścieżki utworzony w kodzie poniżej zmienia kolor tekstu na czerwony (FF) przy przezroczystości 50% (80) i ustawia czcionkę szeryfową.

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;

Do śledzenia tego żądania możesz użyć zwróconego obiektu GCKRequest.

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;
  }
}

Więcej informacji znajdziesz w sekcji Aktualizacje stanu poniżej. Aplikacje powinny umożliwiać użytkownikom aktualizowanie stylu ścieżek tekstowych za pomocą ustawień systemu lub samej aplikacji. Dostępny jest domyślny styl (na iOS 7 i nowszych), który można pobrać za pomocą metody statycznej +[GCKMediaTextTrackStyle createDefault]. Można zmienić następujące 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

Odbieraj aktualizacje stanu

Jeśli wielu nadawców jest połączonych z tym samym odbiorcą, każdy z nich powinien wiedzieć o zmianach u odbiorcy, nawet jeśli te zmiany zostały zainicjowane przez innych nadawców.

Aby mieć pewność, że nadawca otrzymywał aktualizacje stanu od odbiorcy, Twoja aplikacja powinna zarejestrować GCKRemoteMediaClientListener. Jeśli GCKMediaTextTrackStyle bieżących multimediów zmieni się, wszyscy połączeni nadawcy zostaną powiadomieni zarówno przez wywołania zwrotne -[remoteMediaClient:didUpdateMediaMetadata:], jak i -[remoteMediaClient:didUpdateMediaStatus:]. W takim przypadku pakiet SDK odbiorcy nie sprawdza, czy nowy styl jest inny niż poprzedni, i powiadamia o tym wszystkich połączonych nadawców. Jeśli jednak lista aktywnych ścieżek zostanie zaktualizowana, powiadomienia otrzymają tylko -[remoteMediaClient:didUpdateMediaStatus:] u połączonych nadawców.

Spełniają wymagania CORS

Do adaptacyjnego streamingu multimediów Google Cast wymaga nagłówków CORS, ale nawet proste strumienie mp4 wymagają CORS, jeśli zawierają ścieżki. Jeśli chcesz włączyć ścieżki w przypadku jakichkolwiek multimediów, musisz włączyć CORS zarówno w przypadku strumieni ścieżek, jak i strumieni multimediów. Jeśli więc nie masz na serwerze nagłówków CORS dla prostych multimediów w formacie mp4, a potem dodasz prostą ścieżkę napisów, przesyłanie strumieniowe multimediów nie będzie możliwe, chyba że zaktualizujesz serwer, dodając odpowiedni nagłówek CORS. Dodatkowo musisz zezwolić na przynajmniej te nagłówki: Content-Type, Accept-Encoding i Range. Pamiętaj, że ostatnie 2 nagłówki to dodatkowe nagłówki, które wcześniej mogły nie być potrzebne.