MediaTrack
はメディア トラック(音声ストリーム、動画ストリーム、テキスト(字幕、クローズド キャプションなど))を表します。アプリでは、メディア トラックのグループ化、スタイル設定、有効化が可能です。
トラックを設定する
トラックを設定し、一意の ID を割り当てることができます。次のコードは、それぞれ固有の ID を持つ英語のテキスト トラック、フランス語のテキスト トラック、フランス語の音声トラックを作成します。
val englishSubtitle = MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build() val frenchSubtitle = MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build() val frenchAudio = MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build()
MediaTrack englishSubtitle = new MediaTrack.Builder(1 /* ID */, MediaTrack.TYPE_TEXT) .setName("English Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_en.vtt") /* language is required for subtitle type but optional otherwise */ .setLanguage("en-US") .build(); MediaTrack frenchSubtitle = new MediaTrack.Builder(2, MediaTrack.TYPE_TEXT) .setName("French Subtitle") .setSubtype(MediaTrack.SUBTYPE_SUBTITLES) .setContentId("https://some-url/caption_fr.vtt") .setLanguage("fr") .build(); MediaTrack frenchAudio = new MediaTrack.Builder(3, MediaTrack.TYPE_AUDIO) .setName("French Audio") .setContentId("trk0001") .setLanguage("fr") .build();
グループトラック
複数のトラックはメディア アイテムにグループ化できます。これは MediaInfo
で表されます。
MediaInfo
のインスタンスはトラックの配列を取得し、メディア アイテムに関する他の情報を集約します。この例に基づいて、アプリは 3 つのトラックのリストを MediaInfo.Builder.setMediaTracks(List)
に渡すことで、その 3 つのメディア トラックをメディア アイテムに追加できます。アプリは、メディアをレシーバに読み込む前に、この方法で MediaInfo
にトラックを関連付ける必要があります。
val tracks: MutableList<MediaTrack> = ArrayList<MediaTrack>() tracks.add(englishSubtitle) tracks.add(frenchSubtitle) tracks.add(frenchAudio) val mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build()
List tracks = new ArrayList(); tracks.add(englishSubtitle); tracks.add(frenchSubtitle); tracks.add(frenchAudio); MediaInfo mediaInfo = MediaInfo.Builder(url) .setStreamType(MediaInfo.STREAM_TYPE_BUFFERED) .setContentType(getContentType()) .setMetadata(getMetadata()) .setMediaTracks(tracks) .build();
トラックを削除
現在のメディアからすべてのトラックを削除するには(この例では 3 つのサブタイトルをオフにするなど)、MediaInfo.Builder.setMediaTracks(List)
を呼び出して、ID の空のリストを渡します。
トラックを更新
メディア アイテムに関連付けられたトラックを(メディアの読み込み後に)アプリで有効にするには、RemoteMediaClient.setActiveMediaTracks(long[])
を呼び出して、有効にするトラックの ID を渡します。この例では、フランス語の字幕とフランス語の音声を有効にします。
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(longArrayOf(2, 3)) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.status.statusCode ) } })
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setActiveMediaTracks(new long[]{2, 3}) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed with status code:" + mediaChannelResult.getStatus().getStatusCode()); } });
テキスト トラックのスタイルを設定する
TextTrackStyle
は、テキスト トラックのスタイル情報をカプセル化します。既存の TextTrackStyle を作成または更新した後、次のように RemoteMediaClient.setTextTrackStyle
を呼び出すことで、そのスタイルを現在再生中のメディア アイテムに適用できます。
// the ID for the French subtitle is '2' and for the French audio '3' remoteMediaClient.setTextTrackStyle(style) .setResultCallback(ResultCallback { mediaChannelResult: RemoteMediaClient.MediaChannelResult -> if (!mediaChannelResult.status.isSuccess) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.status.statusCode ) } })
remoteMediaClient.setTextTrackStyle(style) .setResultCallback(mediaChannelResult -> { if (!mediaChannelResult.getStatus().isSuccess()) { Log.e(TAG, "Failed to set the style, status code: " + mediaChannelResult.getStatus().getStatusCode()); } });
アプリでは、システムまたはアプリ自体の設定を使用して、ユーザーがテキスト トラックのスタイルを更新できるようにする必要があります。Android KitKat 以降では、フレームワークが提供するシステム全体の字幕設定を使用できます。
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);
KitKat より前のバージョンでは、上記の呼び出しによってフィールドが未定義のオブジェクトが返されるため、ユーザーの選択と一部のデフォルト値に基づいて、アプリ内のフィールドに値を入力する必要があります。以下のテキスト トラックのスタイル要素のスタイルを設定できます。
- 前景(テキスト)の色と不透明度
- 背景の色と透明度
- エッジの種類
- エッジの色
- フォント スケール
- フォントファミリー
- フォント スタイル
たとえば、次のように、テキストの色を不透明度 80%(赤 80%)に設定します。
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));
KitKat 以降のバージョンでは、システム全体で字幕の設定が更新されたとき、通知を受け取るようにアプリを登録する必要があります。そのためには、CaptioningManager.CaptioningChangeListener
をアプリに実装し、次のようにこのリスナーを登録する必要があります。
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
CaptioningManager.addCaptioningChangeListener(yourChangeListener);
字幕設定の変更が変更されたというコールバックをアプリで受信したら、新しい設定を抽出し、RemoteMediaClient.setTextTrackStyle
を呼び出して新しいスタイルを渡して、現在再生中のメディアのテキスト テキストのスタイルを更新する必要があります。
ステータスの更新を受け取る
複数の送信者が同じ受信者に接続されている場合、他の送信者から変更が開始されても、各送信者が受信者の変更を認識していることが重要です。
そのため、アプリで RemoteMediaClient.Listener
と RemoteMediaClient.ProgressListener
を登録する必要があります。
現在のメディアの TextTrackStyle
が変更されると、接続されたすべての送信者が、上記の両方の登録済みのリスナーを介して通知されます。この場合、レシーバー SDK は、新しいスタイルが前のスタイルと異なるかどうかを検証せず、接続されたすべての送信者に通知を通知します。ただし、アクティブなトラックのステータスが変更された場合は、接続された送信者の RemoteMediaClient.ProgressListener
にのみ通知されます。
CORS 要件を満たす
アダプティブ メディア ストリーミングの場合、Google Cast には CORS ヘッダーが必要ですが、Track が含まれている場合、単純な mp4 メディア ストリームでも CORS が必要です。任意のメディアでトラックを有効にする場合は、トラック ストリームとメディア ストリームの両方で CORS を有効にする必要があります。したがって、サーバー上の単純な mp4 メディアに CORS ヘッダーがなく、単純なサブタイトル トラックを追加した場合、適切な CORS ヘッダーを含むようにサーバーを更新するまで、メディアをストリーミングできません。また、Content-Type、Accept-Encoding、Range のうち少なくとも 1 つのヘッダーを許可する必要があります。最後の 2 つのヘッダーは、以前は必要なかった追加のヘッダーであることに注意してください。