# TrackSelector

Artifact: [androidx.media3:media3-exoplayer](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/exoplayer/trackselection/TrackSelector.java+class:androidx.media3.exoplayer.trackselection.TrackSelector)

*** ** * ** ***


```
@UnstableApi
abstract class TrackSelector
```

<br />

Known direct subclasses [MappingTrackSelector](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/MappingTrackSelector)

|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/MappingTrackSelector` | Base class for `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector`s that first establish a mapping between `https://developer.android.com/reference/kotlin/androidx/media3/common/TrackGroup`s and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/Renderer`s, and then from that mapping create a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/ExoTrackSelection` for each renderer. |

Known indirect subclasses [DefaultTrackSelector](https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/DefaultTrackSelector), [FakeTrackSelector](https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeTrackSelector)

|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/DefaultTrackSelector` | A default `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector` suitable for most use cases. |
| `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeTrackSelector` | A fake `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/MappingTrackSelector` that returns `https://developer.android.com/reference/kotlin/androidx/media3/test/utils/FakeTrackSelection`s. |

*** ** * ** ***

The component of an `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/ExoPlayer` responsible for selecting tracks to be consumed by each of the player's `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/Renderer`s. The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/DefaultTrackSelector` implementation should be suitable for most use cases.

## Interactions with the player

The following interactions occur between the player and its track selector during playback.

- When the player is created it will initialize the track selector by calling `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#init(androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener,androidx.media3.exoplayer.upstream.BandwidthMeter)`.
- When the player needs to make a track selection it will call `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)`. This typically occurs at the start of playback, when the player starts to buffer a new period of the media being played, and when the track selector invalidates its previous selections.
- The player may perform a track selection well in advance of the selected tracks becoming active, where active is defined to mean that the renderers are actually consuming media corresponding to the selection that was made. For example when playing media containing multiple periods, the track selection for a period is made when the player starts to buffer that period. Hence if the player's buffering policy is to maintain a 30 second buffer, the selection will occur approximately 30 seconds in advance of it becoming active. In fact the selection may never become active, for example if the user seeks to some other period of the media during the 30 second gap. The player indicates to the track selector when a selection it has previously made becomes active by calling `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#onSelectionActivated(java.lang.Object)`.
- When the track selector's configuration changes (for example, if it now wishes to prefer audio tracks in a particular language) or its previous selections become invalid, it can trigger invalidation by calling `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#invalidate(androidx.media3.common.TrackSelectionParameters)`. This invokes `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener#onTrackSelectionsInvalidated(androidx.media3.common.TrackSelectionParameters)` on the `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener` that was passed to `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#init(androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener,androidx.media3.exoplayer.upstream.BandwidthMeter)`. When handling this callback, if `parameters` is not `null`, the listener must call `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#onParametersActivated(androidx.media3.common.TrackSelectionParameters)` to activate the updated parameters before triggering the player to make new track selections. Note that the player will have to re-buffer if the new track selection for the currently playing period differs from the one that was invalidated.
- When the player is `https://developer.android.com/reference/kotlin/androidx/media3/common/Player#release()`, it will release the track selector by calling `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#release()`.

## Track selection parameters

Track selection parameters can be retrieved and modified on the application thread by calling `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#getParameters()` and `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#setParameters(androidx.media3.common.TrackSelectionParameters)` respectively (if supported, as indicated by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#isSetParametersSupported()`). Modifying parameters on the application thread triggers the invalidation flow described above, ensuring that the updated parameters are activated and applied on the playback thread.

## Renderer configuration

The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult` returned by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)` contains not only `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelection`s for each renderer, but also `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererConfiguration`s defining configuration parameters that the renderers should apply when consuming the corresponding media. Whilst it may seem counter- intuitive for a track selector to also specify renderer configuration information, in practice the two are tightly bound together. It may only be possible to play a certain combination tracks if the renderers are configured in a particular way. Equally, it may only be possible to configure renderers in a particular way if certain tracks are selected. Hence it makes sense to determine the track selection and corresponding renderer configurations in a single step.

## Threading model

All methods must be called on the same playback thread, except for those specifically documented to be called on a separate application thread.

## Summary

| ### Nested types |
|---|
| `interface https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.Factory` Factory for creating `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector` from `https://developer.android.com/reference/android/content/Context.html`. |
| `interface https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener` Notified when selections previously made by a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector` are no longer valid. |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#TrackSelector()()` |

| ### Public functions |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#getParameters()()` Returns the current parameters for track selection. |
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities.Listener?` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#getRendererCapabilitiesListener()()` Returns the `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities.Listener` that the concrete instance uses to listen to the renderer capabilities changes. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/annotation/CallSuper https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#init(androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener,androidx.media3.exoplayer.upstream.BandwidthMeter)( listener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener!, bandwidthMeter: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter! )` Called by the player to initialize the selector. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-boolean/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#isSetParametersSupported()()` Returns if this `TrackSelector` supports `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#setParameters(androidx.media3.common.TrackSelectionParameters)`. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#onParametersActivated(androidx.media3.common.TrackSelectionParameters)(parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters?)` Called by the player when track selection parameters become active for subsequent track selections made by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)`. |
| `abstract https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#onSelectionActivated(java.lang.Object)(info: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?)` Called by the player when a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult` previously generated by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)` is activated. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `@https://developer.android.com/reference/kotlin/androidx/annotation/CallSuper https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#release()()` Called by the player to release the selector. |
| `abstract https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult!` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)( rendererCapabilities: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html<https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities!>!, trackGroups: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/TrackGroupArray!, periodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!, timeline: https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline! )` Called by the player to perform a track selection. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#setAudioAttributes(androidx.media3.common.AudioAttributes)(audioAttributes: https://developer.android.com/reference/kotlin/androidx/media3/common/AudioAttributes!)` Called by the player to set the `https://developer.android.com/reference/kotlin/androidx/media3/common/AudioAttributes` that will be used for playback. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#setParameters(androidx.media3.common.TrackSelectionParameters)(parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters!)` Called by the player to provide parameters for track selection. |

| ### Protected functions |
|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#invalidate(androidx.media3.common.TrackSelectionParameters)(parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters?)` Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener#onTrackSelectionsInvalidated(androidx.media3.common.TrackSelectionParameters)` to invalidate all previously generated track selections. |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#invalidateForRendererCapabilitiesChange(androidx.media3.exoplayer.Renderer)(renderer: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/Renderer!)` Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener#onRendererCapabilitiesChanged(androidx.media3.exoplayer.Renderer)` to invalidate all previously generated track selections because a renderer's capabilities have changed. |

| ### Protected properties |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter?` | `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#bandwidthMeter()` |

## Public constructors

### TrackSelector

```
TrackSelector()
```

## Public functions

### getParameters

```
fun getParameters(): TrackSelectionParameters!
```

Returns the current parameters for track selection.

This method must be called from the application thread.

### getRendererCapabilitiesListener

```
fun getRendererCapabilitiesListener(): RendererCapabilities.Listener?
```

Returns the `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities.Listener` that the concrete instance uses to listen to the renderer capabilities changes. May be `null` if the implementation does not listen to the renderer capabilities changes.

### init

```
@CallSuper
fun init(
    listener: TrackSelector.InvalidationListener!,
    bandwidthMeter: BandwidthMeter!
): Unit
```

Called by the player to initialize the selector.

This method must be called from the application thread.

| Parameters |
|---|---|
| `listener: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener!` | An invalidation listener that the selector can call to indicate that selections it has previously made are no longer valid. |
| `bandwidthMeter: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/upstream/BandwidthMeter!` | A bandwidth meter which can be used by track selections to select tracks. |

### isSetParametersSupported

```
fun isSetParametersSupported(): Boolean
```

Returns if this `TrackSelector` supports `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#setParameters(androidx.media3.common.TrackSelectionParameters)`.

The same value is always returned for a given `TrackSelector` instance.

This method must be called from the application thread.

### onParametersActivated

```
fun onParametersActivated(parameters: TrackSelectionParameters?): Unit
```

Called by the player when track selection parameters become active for subsequent track selections made by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)`.

| Parameters |
|---|---|
| `parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters?` | The activated track selection parameters, or `null` if no new parameters need to be activated. |

### onSelectionActivated

```
abstract fun onSelectionActivated(info: Any?): Unit
```

Called by the player when a `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult` previously generated by `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#selectTracks(androidx.media3.exoplayer.RendererCapabilities[],androidx.media3.exoplayer.source.TrackGroupArray,androidx.media3.exoplayer.source.MediaSource.MediaPeriodId,androidx.media3.common.Timeline)` is activated.

| Parameters |
|---|---|
| `info: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-any/index.html?` | The value of `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult#info()` in the activated selection. |

### release

```
@CallSuper
fun release(): Unit
```

Called by the player to release the selector. The selector cannot be used until `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#init(androidx.media3.exoplayer.trackselection.TrackSelector.InvalidationListener,androidx.media3.exoplayer.upstream.BandwidthMeter)` is called again.

### selectTracks

```
abstract fun selectTracks(
    rendererCapabilities: Array<RendererCapabilities!>!,
    trackGroups: TrackGroupArray!,
    periodId: MediaSource.MediaPeriodId!,
    timeline: Timeline!
): TrackSelectorResult!
```

Called by the player to perform a track selection.

| Parameters |
|---|---|
| `rendererCapabilities: https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-array/index.html<https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities!>!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/RendererCapabilities` of the renderers for which tracks are to be selected. |
| `trackGroups: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/TrackGroupArray!` | The available track groups. |
| `periodId: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId!` | The `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/source/MediaSource.MediaPeriodId` of the period for which tracks are to be selected. |
| `timeline: https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline!` | The `https://developer.android.com/reference/kotlin/androidx/media3/common/Timeline` holding the period for which tracks are to be selected. |

| Returns |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult!` | A `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelectorResult` describing the track selections. |

| Throws |
|---|---|
| `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/ExoPlaybackException` | If an error occurs selecting tracks. |

### setAudioAttributes

```
fun setAudioAttributes(audioAttributes: AudioAttributes!): Unit
```

Called by the player to set the `https://developer.android.com/reference/kotlin/androidx/media3/common/AudioAttributes` that will be used for playback.

### setParameters

```
fun setParameters(parameters: TrackSelectionParameters!): Unit
```

Called by the player to provide parameters for track selection.

Only supported if `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector#isSetParametersSupported()` returns true.

This method must be called from the application thread.

| Parameters |
|---|---|
| `parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters!` | The parameters for track selection. |

## Protected functions

### invalidate

```
protected fun invalidate(parameters: TrackSelectionParameters?): Unit
```

Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener#onTrackSelectionsInvalidated(androidx.media3.common.TrackSelectionParameters)` to invalidate all previously generated track selections.

This method can be called from both the application and the playback thread.

| Parameters |
|---|---|
| `parameters: https://developer.android.com/reference/kotlin/androidx/media3/common/TrackSelectionParameters?` | The track selection parameters, or `null` to re-evaluate selections without applying new parameters. |

### invalidateForRendererCapabilitiesChange

```
protected fun invalidateForRendererCapabilitiesChange(renderer: Renderer!): Unit
```

Calls `https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/trackselection/TrackSelector.InvalidationListener#onRendererCapabilitiesChanged(androidx.media3.exoplayer.Renderer)` to invalidate all previously generated track selections because a renderer's capabilities have changed.

| Parameters |
|---|---|
| `renderer: https://developer.android.com/reference/kotlin/androidx/media3/exoplayer/Renderer!` | The renderer whose capabilities changed. |

## Protected properties

### bandwidthMeter

```
protected val bandwidthMeter: BandwidthMeter?
```