トラックの選択

メディア アイテムに複数のトラックが含まれている場合、トラックの選択は、 どちらが再生に選択されるかが決まります。トラック選択プロセスは TrackSelectionParameters によって設定されます。これにより、 指定するトラック選択に影響を与えるため、制約とオーバーライドを行います。

利用可能なトラックのクエリ

Player.Listener.onTracksChanged を再生して、変更に関する通知を受け取ることができます 次のようなトラックにご参加いただけます。

  • 利用可能なトラックは、メディア アイテムの準備中に判明 表示されます。なお、プレーヤーは、認識するためにメディア アイテムを準備する必要があります。 トラックの内容を確認できます
  • 再生が 1 つのメディアから移行するため、利用可能なトラックが変わる 移動します
  • 選択したトラックに対する変更。

Kotlin

player.addListener(
  object : Player.Listener {
    override fun onTracksChanged(tracks: Tracks) {
      // Update UI using current tracks.
    }
  }
)

Java

player.addListener(
    new Player.Listener() {
      @Override
      public void onTracksChanged(Tracks tracks) {
        // Update UI using current tracks.
      }
    });

player.getCurrentTracks() を呼び出して現在のトラックをクエリすることもできます。 返される Tracks には、Track.Group オブジェクトのリストが含まれます。 単一の Group は同じコンテンツですが、形式が異なります。

トラックをグループ化する方法の例として、アダプティブ再生について考えてみましょう。 メイン動画フィードは 5 つのビットレートで提供され、代替の動画フィードも提供されます。 (たとえば、スポーツの試合で異なるカメラアングル)は 2 つのビットレートで提供されます。 この場合、2 つの動画トラック グループがあり、1 つはメインの 5 つのトラックを含む動画フィードと、代替動画フィードの 1 つ 2 つのトラックを含みます

言語が異なる音声トラックはグループ化されません。これは、 同じとは見なされません。逆に、音声トラックは 同じ言語で書かれていて、ビットレート、サンプリングなどの特性のみが レート、チャンネル数などを グループ化できますこれはテキスト トラックにも適用されます。

Group に対してクエリを実行することで、どのトラックがサポートされているかを判断できます。 現在選択されている再生、各トラックが使用する Format:

Kotlin

for (trackGroup in tracks.groups) {
  // Group level information.
  val trackType = trackGroup.type
  val trackInGroupIsSelected = trackGroup.isSelected
  val trackInGroupIsSupported = trackGroup.isSupported
  for (i in 0 until trackGroup.length) {
    // Individual track information.
    val isSupported = trackGroup.isTrackSupported(i)
    val isSelected = trackGroup.isTrackSelected(i)
    val trackFormat = trackGroup.getTrackFormat(i)
  }
}

Java

for (Tracks.Group trackGroup : tracks.getGroups()) {
  // Group level information.
  @C.TrackType int trackType = trackGroup.getType();
  boolean trackInGroupIsSelected = trackGroup.isSelected();
  boolean trackInGroupIsSupported = trackGroup.isSupported();
  for (int i = 0; i < trackGroup.length; i++) {
    // Individual track information.
    boolean isSupported = trackGroup.isTrackSupported(i);
    boolean isSelected = trackGroup.isTrackSelected(i);
    Format trackFormat = trackGroup.getTrackFormat(i);
  }
}

  • Player がトラックをデコードおよびレンダリングできる場合、トラックはサポートされます。 提供しますなお、同じタイプのトラック グループ( 複数の音声トラック グループなど)がサポートされている場合、 個別にサポートされているため、プレーヤーは必ずしも特定の時点で できます。
  • 現在のトラックが再生対象として選択されている場合、そのトラックは選択されます。 TrackSelectionParameters。1 つのトラック グループ内の複数のトラックが 選択すると、プレーヤーはこれらのトラックをアダプティブ再生( ビットレートの異なる複数の動画トラックなど)を扱う場合。なお、このうち 1 つのみが 曲が再生されます。

トラック選択パラメータの変更

トラック選択プロセスは、 Player.setTrackSelectionParameters。この作業は、導入前と導入中の両方で行うことができます。 おすすめします。次の例は、現在の TrackSelectionParameters を取得し、変更して Player を更新します。 結果を変更します。

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setMaxVideoSizeSd()
    .setPreferredAudioLanguage("hu")
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setMaxVideoSizeSd()
        .setPreferredAudioLanguage("hu")
        .build());

制約ベースのトラック選択

TrackSelectionParameters のほとんどのオプションでは、制約を指定できます。 実際に利用できるトラックとは無関係です使用可能 次のような制約があります。

  • 動画の幅、高さ、フレームレート、ビットレートの最大値と最小値。
  • 最大音声チャンネル数とビットレート。
  • 動画と音声の優先 MIME タイプ。
  • 優先される音声言語とロールのフラグ。
  • 使用するテキスト言語とロールフラグ。

ExoPlayer は、これらの制約に対して適切なデフォルト値を使用します。 解像度をディスプレイ サイズに設定し、指定した音声言語を優先的に ユーザーのシステムの言語 / 地域設定と一致している。

制約ベースのトラック選択を 利用可能なトラックの中から 特定のトラックを選択します

  • 制約は、メディア アイテムが提供するトラックを確認する前に指定できます。 つまり、プレーヤーがコンテナを準備する前に制約を指定できます。 選択できますが、特定のトラックを選択するには、 利用可能なトラックが判明するまでお待ちください。
  • 制約は、再生リスト内のすべてのメディア アイテムに適用されます。 アイテムごとに使用可能なトラックが異なります。たとえば、使用する音声言語は、 指定した場合でも、すべてのメディア アイテムに その言語のトラックの Format はメディア アイテムによって異なります。 以下で説明するように、特定のトラックを選択する場合はこの点が異なります。

特定のトラックを選択する

TrackSelectionParameters を使用して特定のトラックを選択することもできます。まず、 プレーヤーで現在利用可能なトラックをクエリするには、 Player.getCurrentTracks。次に 選択する曲を特定したら TrackSelectionOverride を使用して TrackSelectionParameters で設定できます。 たとえば、特定の audioTrackGroup から最初のトラックを選択するには、次のようにします。

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setOverrideForType(
      TrackSelectionOverride(audioTrackGroup.mediaTrackGroup, /* trackIndex= */ 0)
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setOverrideForType(
            new TrackSelectionOverride(
                audioTrackGroup.getMediaTrackGroup(), /* trackIndex= */ 0))
        .build());

TrackSelectionOverride は、 オーバーライドで指定したものと完全に一致する TrackGroup。したがって、 後続のメディア アイテムにオーバーライドは適用されませんが、 あります。

トラックタイプまたはトラックグループを無効にする

動画、音声、テキストなどのトラックタイプは、 TrackSelectionParameters.Builder.setTrackTypeDisabled。無効なトラックタイプ 次のすべてのメディア アイテムで無効になります。

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .setTrackTypeDisabled(C.TRACK_TYPE_VIDEO, /* disabled= */ true)
        .build());

または、特定のグループからのトラックが選択されないようにすることもできます。 TrackGroup で、そのグループに空のオーバーライドを指定します。

Kotlin

player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .addOverride(
      TrackSelectionOverride(disabledTrackGroup.mediaTrackGroup, /* trackIndices= */ listOf())
    )
    .build()

Java

player.setTrackSelectionParameters(
    player
        .getTrackSelectionParameters()
        .buildUpon()
        .addOverride(
            new TrackSelectionOverride(
                disabledTrackGroup.getMediaTrackGroup(),
                /* trackIndices= */ ImmutableList.of()))
        .build());

トラック セレクタのカスタマイズ

トラックの選択は TrackSelector(インスタンス)が行います これは、ExoPlayer がビルドされて後で取得されるたびに提供されます。 ExoPlayer.getTrackSelector() と一緒に使用できます。

Kotlin

val trackSelector = DefaultTrackSelector(context)
val player = ExoPlayer.Builder(context).setTrackSelector(trackSelector).build()

Java

DefaultTrackSelector trackSelector = new DefaultTrackSelector(context);
ExoPlayer player = new ExoPlayer.Builder(context).setTrackSelector(trackSelector).build();

DefaultTrackSelector は、ほとんどの用途に適した柔軟な TrackSelector です。 対応できますPlayer に設定された TrackSelectionParameters を使用するだけでなく、 高度なカスタマイズ オプションがいくつか用意されています。 DefaultTrackSelector.ParametersBuilder:

Kotlin

trackSelector.setParameters(
  trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true))
)

Java

trackSelector.setParameters(
    trackSelector.buildUponParameters().setAllowVideoMixedMimeTypeAdaptiveness(true));

トンネリング

レンダラと API の組み合わせにより、トンネリング再生を有効にできます。 サポートされていますこれを行うには、 DefaultTrackSelector.ParametersBuilder.setTunnelingEnabled(true)

オーディオ オフロード

オフロードのオーディオ再生は、 サポートしています。これを行うには、 TrackSelectionParameters 内の AudioOffloadModePreferences

Kotlin

val audioOffloadPreferences =
  AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build()
player.trackSelectionParameters =
  player.trackSelectionParameters
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build()

Java

AudioOffloadPreferences audioOffloadPreferences =
  new AudioOffloadPreferences.Builder()
      .setAudioOffloadMode(AudioOffloadPreferences.AUDIO_OFFLOAD_MODE_ENABLED)
      // Add additional options as needed
      .setIsGaplessSupportRequired(true)
      .build();
player.setTrackSelectionParameters(
  player.getTrackSelectionParameters()
    .buildUpon()
    .setAudioOffloadPreferences(audioOffloadPreferences)
    .build());
);