メディア トラックの使用

メディア トラックは、音声または動画のストリーム オブジェクト、またはテキスト オブジェクト(字幕またはキャプション)にすることができます。

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

メディア アイテムには複数のトラックを設定できます。たとえば、複数の字幕(言語ごとに 1 つ)や複数の代替音声ストリーム(言語ごとに 1 つ)を設定できます。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] を呼び出すことで、現在再生中のメディア アイテムに適用できます。次のコードで作成されたトラック スタイルでは、テキストが 50% の不透明度(80)で赤色(FF)になり、セリフフォントが設定されます。

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

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

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

ステータスの更新情報を受け取る

複数の送信者が同じ受信者に接続されている場合、変更が他の送信者から開始された場合でも、各送信者が受信者の変更を認識することが重要です。

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

CORS 要件を満たす

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