Использование медиа-дорожек

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

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

Быстрый
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)
Цель-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 . Вашему приложению необходимо установить эту ассоциацию перед загрузкой мультимедиа в получатель, как показано в следующем коде:

Быстрый
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()
Цель-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 и передав идентификаторы дорожек, которые нужно активировать. Например, следующий код активирует дорожку субтитров, созданную выше.

Быстрый
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
Цель-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

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

Быстрый
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Цель-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

Стиль текстовых дорожек

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

Быстрый
let textTrackStyle = GCKMediaTextTrackStyle.createDefault()
textTrackStyle.foregroundColor = GCKColor.init(cssString: "#FF000080")
textTrackStyle.fontFamily = "serif"
styleChangeRequest = sessionManager.currentSession?.remoteMediaClient?.setTextTrackStyle(textTrackStyle)
styleChangeRequest?.delegate = self
Цель-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 для отслеживания этого запроса.

Быстрый
// MARK: - GCKRequestDelegate

func requestDidComplete(_ request: GCKRequest) {
  if request == styleChangeRequest {
    print("Style update completed.")
    styleChangeRequest = nil
  }
}
Цель-C
#pragma mark - GCKRequestDelegate

- (void)requestDidComplete:(GCKRequest *)request {
  if (request == self.styleChangeRequest) {
    NSLog(@"Style update completed.");
    self.styleChangeRequest = nil;
  }
}

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

  • Цвет и непрозрачность переднего плана (текста)
  • Цвет фона и непрозрачность
  • Тип кромки
  • Цвет края
  • Масштаб шрифта
  • Семейство шрифтов
  • Стиль шрифта

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

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

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

Удовлетворение требований CORS

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