使用媒体轨道

媒体轨道可以是音频或视频流对象,也可以是文本对象(字幕) 或图片说明)。

GCKMediaTrack 对象表示路线。它由唯一数字标识符和其他 属性(例如 Content ID 和 title)。GCKMediaTrack 实例可以 创建如下:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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 是表示媒体项的类。要将一组 Pod 相关联 GCKMediaTrack 对象 包含媒体项,您的应用应更新其 mediaTracks 属性。您的应用需要先建立此关联,然后才能加载 将媒体传递给接收器,如以下代码所示:

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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 并传递要激活的轨道的 ID。例如,以下 代码会激活上面创建的字幕轨道。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];

要停用当前媒体项上的曲目,请调用 -[setActiveTrackIDs:]已开启 GCKRemoteMediaClient (空数组或 nil)。以下代码可停用字幕轨道。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
Swift
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
Objective-C
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];

设置文字轨道的样式

通过 GCKMediaTextTrackStyle 类用于封装文本轨道的样式信息。跟踪样式可以是 通过调用 -[GCKRemoteMediaClient setTextTrackStyle]。 在以下代码中创建的轨迹样式将文本显示为红色 (FF),透明度为 50% (80) 并设置 Serif 字体。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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 对象: 跟踪此请求。

<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
</ph>
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;
  }
}

查看状态更新 。应用应允许用户更新文本样式 使用系统或应用本身提供的设置。 系统提供默认样式(在 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。请注意, 最后两个标头是您之前可能不需要的其他标头。