メディア トラックを使用する

MediaTrack はメディア トラック(音声ストリーム、動画ストリーム、テキスト(字幕、クローズド キャプションなど))を表します。アプリでは、メディア トラックのグループ化、スタイル設定、有効化が可能です。

トラックを設定する

トラックを設定し、一意の ID を割り当てることができます。次のコードは、それぞれ固有の ID を持つ英語のテキスト トラック、フランス語のテキスト トラック、フランス語の音声トラックを作成します。

Kotlin
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()
Java
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 にトラックを関連付ける必要があります。

Kotlin
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()
Java
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 を渡します。この例では、フランス語の字幕とフランス語の音声を有効にします。

Kotlin
// 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
                    )
                }
    })
Java
// 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 を呼び出すことで、そのスタイルを現在再生中のメディア アイテムに適用できます。

Kotlin
// 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
                    )
                }
    })
Java
remoteMediaClient.setTextTrackStyle(style)
    .setResultCallback(mediaChannelResult -> {
        if (!mediaChannelResult.getStatus().isSuccess()) {
            Log.e(TAG, "Failed to set the style, status code: " +
                    mediaChannelResult.getStatus().getStatusCode());
        }
    });

アプリでは、システムまたはアプリ自体の設定を使用して、ユーザーがテキスト トラックのスタイルを更新できるようにする必要があります。Android KitKat 以降では、フレームワークが提供するシステム全体の字幕設定を使用できます。

Kotlin
val textTrackStyle = TextTrackStyle.fromSystemSettings(context)
Java
TextTrackStyle textTrackStyle = TextTrackStyle.fromSystemSettings(context);

KitKat より前のバージョンでは、上記の呼び出しによってフィールドが未定義のオブジェクトが返されるため、ユーザーの選択と一部のデフォルト値に基づいて、アプリ内のフィールドに値を入力する必要があります。以下のテキスト トラックのスタイル要素のスタイルを設定できます。

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

たとえば、次のように、テキストの色を不透明度 80%(赤 80%)に設定します。

Kotlin
textTrackStyle.foregroundColor = Color.parseColor("#80FF0000")
Java
textTrackStyle.setForegroundColor(Color.parseColor("#80FF0000"));

KitKat 以降のバージョンでは、システム全体で字幕の設定が更新されたとき、通知を受け取るようにアプリを登録する必要があります。そのためには、CaptioningManager.CaptioningChangeListener をアプリに実装し、次のようにこのリスナーを登録する必要があります。

Kotlin
CaptioningManager.addCaptioningChangeListener(yourChangeListener)
Java
CaptioningManager.addCaptioningChangeListener(yourChangeListener);

字幕設定の変更が変更されたというコールバックをアプリで受信したら、新しい設定を抽出し、RemoteMediaClient.setTextTrackStyle を呼び出して新しいスタイルを渡して、現在再生中のメディアのテキスト テキストのスタイルを更新する必要があります。

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

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

そのため、アプリで RemoteMediaClient.ListenerRemoteMediaClient.ProgressListener を登録する必要があります。

現在のメディアの TextTrackStyle が変更されると、接続されたすべての送信者が、上記の両方の登録済みのリスナーを介して通知されます。この場合、レシーバー SDK は、新しいスタイルが前のスタイルと異なるかどうかを検証せず、接続されたすべての送信者に通知を通知します。ただし、アクティブなトラックのステータスが変更された場合は、接続された送信者の RemoteMediaClient.ProgressListener にのみ通知されます。

CORS 要件を満たす

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