媒体轨道可以是音频或视频流对象,也可以是文本对象(字幕) 或图片说明)。
GCKMediaTrack
对象表示路线。它由唯一数字标识符和其他
属性(例如 Content ID 和 title)。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
是表示媒体项的类。要将一组 Pod 相关联
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
并传递要激活的轨道的 ID。例如,以下
代码会激活上面创建的字幕轨道。
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];
要停用当前媒体项上的曲目,请调用
-[setActiveTrackIDs:]
已开启
GCKRemoteMediaClient
(空数组或 nil)。以下代码可停用字幕轨道。
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];
设置文字轨道的样式
通过
GCKMediaTextTrackStyle
类用于封装文本轨道的样式信息。跟踪样式可以是
通过调用
-[GCKRemoteMediaClient
setTextTrackStyle]
。
在以下代码中创建的轨迹样式将文本显示为红色 (FF),透明度为 50%
(80) 并设置 Serif 字体。
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。请注意, 最后两个标头是您之前可能不需要的其他标头。