メディア トラックは、音声または動画のストリーム オブジェクト、またはテキスト オブジェクト(字幕またはキャプション)にすることができます。
GCKMediaTrack オブジェクトはトラックを表します。一意の数値識別子と、コンテンツ ID やタイトルなどの他の属性で構成されます。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];
メディア アイテムには複数のトラックを設定できます。たとえば、複数の字幕(言語ごとに 1 つ)や複数の代替音声ストリーム(言語ごとに 1 つ)を設定できます。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];
GCKRemoteMediaClient で -[setActiveTrackIDs:] を呼び出し、有効にするトラックの ID を渡すことで、メディア アイテムに関連付けられた 1 つ以上のトラックを有効にします(メディアの読み込み後)。たとえば、次のコードは、上記で作成したキャプション トラックを有効にします。
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([1])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[@1]];
現在のメディア アイテムのトラックを無効にするには、空の配列または nil を指定して GCKRemoteMediaClient で -[setActiveTrackIDs:] を呼び出します。次のコードは、字幕トラックを無効にします。
sessionManager.currentSession?.remoteMediaClient?.setActiveTrackIDs([])
[self.sessionManager.currentSession.remoteMediaClient setActiveTrackIDs:@[]];
テキスト トラックのスタイルを設定する
GCKMediaTextTrackStyle クラスは、テキスト トラックのスタイル情報をカプセル化します。トラック スタイルは、-[GCKRemoteMediaClient
setTextTrackStyle] を呼び出すことで、現在再生中のメディア アイテムに適用できます。次のコードで作成されたトラック スタイルでは、テキストが 50% の不透明度(80)で赤色(FF)になり、セリフフォントが設定されます。
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; } }
詳しくは、下記のステータスの更新をご覧ください。アプリは、システムが提供する設定またはアプリ自体を使用して、テキスト トラックのスタイルを更新できるようにする必要があります。デフォルトのスタイルが用意されており、静的メソッド +[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 つのヘッダーは、以前は必要なかった追加のヘッダーです。