Медиа-трек может быть объектом аудио- или видеопотока или текстовым объектом (субтитром или заголовком).
Объект 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)
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()
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])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];
Чтобы деактивировать дорожку для текущего элемента мультимедиа, вызовите -[setActiveTrackIDs:]
в GCKRemoteMediaClient
с пустым массивом или нулем. Следующий код отключает дорожку субтитров.
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[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
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 } }
#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. Обратите внимание, что последние два заголовка — это дополнительные заголовки, которые ранее вам, возможно, не требовались.