メディア トラックの使用

メディア トラックには、音声や動画のストリーム オブジェクト、テキスト オブジェクト(字幕)を使用できます。

GCKMediaTrack オブジェクトはトラックを表します。固有の数値識別子と、コンテンツ ID やタイトルなどの他の属性で構成されます。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];

GCKRemoteMediaClient に対して -[setActiveTrackIDs:] を呼び出し、有効にするトラックの ID を渡すことで、メディア アイテムに関連付けられた 1 つ以上のトラックを有効にします(メディアが読み込まれた後)。たとえば、次のコードは、上記で作成した字幕トラックを有効にします。

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

現在のメディア アイテムのトラックを無効にするには、空の配列または nil を使用して GCKRemoteMediaClient-[setActiveTrackIDs:] を呼び出します。次のコードは、字幕トラックを無効にします。

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

テキスト トラックのスタイルを設定する

GCKMediaTextTrackStyle クラスは、テキスト トラックのスタイル情報をカプセル化します。トラック スタイルを現在再生中のメディア アイテムに適用するには、-[GCKRemoteMediaClient setTextTrackStyle] を呼び出します。以下のコードで作成したトラック スタイルは、テキストを赤色(FF)に不透明度 50%(80)で変換し、Serif フォントを設定します。

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

詳しくは、以下のステータスの更新をご覧ください。アプリでは、システムが提供する設定またはアプリ自体の設定を使用して、ユーザーがテキスト トラックのスタイルを更新できるようにする必要があります。iOS 7 以降で提供されているデフォルトのスタイルは、静的メソッド +[GCKMediaTextTrackStyle createDefault] で取得できます。以下のテキスト トラックのスタイル要素を変更できます。

  • 前景(テキスト)の色と不透明度
  • 背景の色と透明度
  • エッジの種類
  • エッジの色
  • フォント スケール
  • フォント ファミリー
  • フォント スタイル

最新ステータスの受信

複数のセンダーが同じレシーバに接続されている場合、変更が他のセンダーから開始されたとしても、各センダーがレシーバの変更を認識することが重要です。

センダーがレシーバーからステータスの更新を確実に受信できるようにするには、アプリで GCKRemoteMediaClientListener を登録する必要があります。現在のメディアの GCKMediaTextTrackStyle が変更されると、-[remoteMediaClient:didUpdateMediaMetadata:] コールバックと -[remoteMediaClient:didUpdateMediaStatus:] コールバックの両方を通じて、接続されているすべてのセンダーに通知されます。この場合、Receiver SDK は新しいスタイルが以前のスタイルと異なるかどうかを検証せず、接続されているすべての送信者に通知します。ただし、アクティブなトラックのリストが更新された場合は、接続されているセンダーの -[remoteMediaClient:didUpdateMediaStatus:] のみが通知されます。

CORS 要件を満たす

アダプティブなメディア ストリーミングの場合、Google Cast には CORS ヘッダーの存在が必要ですが、シンプルな mp4 メディア ストリームであっても Tracks が含まれている場合は CORS が必要です。メディアのトラックを有効にするには、トラック ストリームとメディア ストリームの両方で CORS を有効にする必要があります。そのため、サーバーでシンプルな mp4 メディアで使用できる CORS ヘッダーがなく、その後に単純な字幕トラックを追加した場合、適切な CORS ヘッダーを含めるようにサーバーを更新しない限り、メディアをストリーミングできません。少なくとも Content-Type、Accept-Encoding、Range の各ヘッダーを許可する必要があります。最後の 2 つのヘッダーは、以前は必要でなかった追加のヘッダーであることに注意してください。