メディア トラックには、音声や動画のストリーム オブジェクト、テキスト オブジェクト(字幕)を使用できます。
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];
メディア アイテムには複数のトラックを含めることができます。たとえば、複数の字幕(それぞれ別の言語)や複数の代替音声ストリーム(異なる言語)を含めることができます。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]
を呼び出します。以下のコードで作成したトラック スタイルは、テキストを赤色(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:]
コールバックの両方を通じて、接続されているすべてのセンダーに通知されます。この場合、Receiver SDK は新しいスタイルが以前のスタイルと異なるかどうかを検証せず、接続されているすべての送信者に通知します。ただし、アクティブなトラックのリストが更新された場合は、接続されているセンダーの -[remoteMediaClient:didUpdateMediaStatus:]
のみが通知されます。
CORS 要件を満たす
アダプティブなメディア ストリーミングの場合、Google Cast には CORS ヘッダーの存在が必要ですが、シンプルな mp4 メディア ストリームであっても Tracks が含まれている場合は CORS が必要です。メディアのトラックを有効にするには、トラック ストリームとメディア ストリームの両方で CORS を有効にする必要があります。そのため、サーバーでシンプルな mp4 メディアで使用できる CORS ヘッダーがなく、その後に単純な字幕トラックを追加した場合、適切な CORS ヘッダーを含めるようにサーバーを更新しない限り、メディアをストリーミングできません。少なくとも Content-Type、Accept-Encoding、Range の各ヘッダーを許可する必要があります。最後の 2 つのヘッダーは、以前は必要でなかった追加のヘッダーであることに注意してください。