Как использовать медиадорожки

Медиадорожка может быть объектом аудио- или видеопотока или текстовым объектом (субтитры или скрытые субтитры).

Объект GCKMediaTrack представляет собой трек. Он состоит из уникального числового идентификатора и других атрибутов, таких как идентификатор контента и название. Создать экземпляр GCKMediaTrack можно следующим образом:

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

У медиаконтента может быть несколько дорожек, например субтитры на разных языках или несколько аудиодорожек на разных языках. GCKMediaInformation – класс, представляющий медиаконтент. Чтобы связать коллекцию объектов GCKMediaTrack с медиаконтентом, приложению необходимо обновить свойство mediaTracks. Приложение должно установить эту связь до того, как загрузит медиаконтент на приемник. Это можно сделать с помощью следующего кода:

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

Активируйте один или несколько треков, связанных с медиаконтентом (после загрузки медиаконтента), вызвав метод -[setActiveTrackIDs:] для объекта GCKRemoteMediaClient и передав идентификаторы треков, которые нужно активировать. Например, следующий код активирует дорожку субтитров, созданную выше.

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

Чтобы деактивировать дорожку в текущем медиаконтенте, вызовите метод -[setActiveTrackIDs:] в объекте GCKRemoteMediaClient с пустым массивом или значением nil. Следующий фрагмент кода отключает дорожку субтитров:

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

Как настроить стиль текстовых дорожек

Класс GCKMediaTextTrackStyle содержит информацию о стиле текстовой дорожки. Стиль дорожки можно применить к текущему воспроизводимому медиаконтенту, вызвав метод -[GCKRemoteMediaClient setTextTrackStyle]. Стиль дорожки, созданный в приведенном ниже коде, делает текст красным (FF) с непрозрачностью 50 % (80) и задает шрифт с засечками.

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;

Для отслеживания этого запроса можно использовать возвращенный объект 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;
  }
}

Подробнее о статусах… Приложения должны позволять пользователям изменять стиль текстовых дорожек с помощью системных настроек или настроек приложения. По умолчанию используется стиль, который можно получить с помощью статического метода +[GCKMediaTextTrackStyle createDefault]. Можно изменить следующие элементы стиля дорожки субтитров:

  • Цвет и прозрачность текста
  • Настройте цвет и прозрачность фона.
  • Тип контура
  • Цвет контура
  • Масштаб шрифта
  • Семейство шрифтов
  • Стиль шрифта

Получать уведомления о статусе

Если к одному приемнику подключено несколько отправителей, важно, чтобы каждый из них знал об изменениях, произошедших на приемнике, даже если эти изменения были инициированы другими отправителями.

Чтобы отправитель получал от получателя обновления статуса, ваше приложение должно зарегистрировать GCKRemoteMediaClientListener. Если значение параметра GCKMediaTextTrackStyle текущего медиаконтента изменится, все подключенные отправители получат уведомление через обратные вызовы -[remoteMediaClient:didUpdateMediaMetadata:] и -[remoteMediaClient:didUpdateMediaStatus:]. В этом случае Receiver SDK не проверяет, отличается ли новый стиль от предыдущего, и уведомляет всех подключенных отправителей. Однако если список активных дорожек будет обновлен, уведомление об этом получит только -[remoteMediaClient:didUpdateMediaStatus:] в подключенных отправителях.

Соблюдайте требования CORS

Для адаптивной потоковой передачи медиаконтента Google Cast требует наличия заголовков CORS, но даже простые медиапотоки MP4 требуют CORS, если они включают дорожки. Если вы хотите включить дорожки для какого-либо медиаконтента, вам необходимо включить CORS как для потоков дорожек, так и для потоков медиаконтента. Поэтому, если у вас нет заголовков CORS для простого медиаконтента MP4 на сервере и вы добавляете дорожку субтитров, вы не сможете транслировать медиаконтент, пока не обновите сервер, добавив соответствующий заголовок CORS. Кроме того, вам нужно разрешить как минимум следующие заголовки: Content-Type, Accept-Encoding и Range. Обратите внимание, что последние два заголовка являются дополнительными и могли не требоваться ранее.