メディア アイテムに複数のトラックが含まれている場合、トラックの選択とは、どのトラックが再生対象として選択されるかを決定するプロセスです。トラック選択プロセスは TrackSelectionParameters
によって構成されます。これにより、さまざまな制約が許容され、トラック選択に影響する指定をオーバーライドします。
利用可能なトラックのクエリ
Player.Listener.onTracksChanged
をリッスンすることで、次のようなトラックの変更に関する通知を受け取ることができます。
- 再生中のメディア アイテムの準備が完了すると、利用可能なトラックが判明します。なお、プレーヤーは、含まれているトラックを把握するためにメディア アイテムを準備する必要があります。
- メディア アイテム間での再生遷移によって、利用可能なトラックが変わる場合。
- 選択したトラックの変更。
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
オブジェクトのリストが含まれます。これらのオブジェクトでは、1 つの 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));
トンネリング
レンダラと選択したトラックの組み合わせでサポートされている場合は、トンネリング再生を有効にできます。そのためには、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()); );