Package com.google.android.exoplayer2

## Interface ExoPlayer

- All Superinterfaces:
    `Player`
  All Known Implementing Classes:
    `SimpleExoPlayer`, `StubExoPlayer`

      public interface ExoPlayer
      extends Player

  An extensible media player that plays `MediaSource`s. Instances can be obtained from `ExoPlayer.Builder`.

  ## Player components

  ExoPlayer is designed to make few assumptions about (and hence impose few restrictions on) the type of the media being played, how and where it is stored, and how it is rendered. Rather than implementing the loading and rendering of media directly, ExoPlayer implementations delegate this work to components that are injected when a player is created or when it's prepared for playback. Components common to all ExoPlayer implementations are:

  - `MediaSources` that define the media to be played, load the media, and from which the loaded media can be read. MediaSources are created from `MediaItems` by the `MediaSource.Factory` injected into the player `Builder`, or can be added directly by methods like `setMediaSource(MediaSource)`. The library provides a `DefaultMediaSourceFactory` for progressive media files, DASH, SmoothStreaming and HLS, which also includes functionality for side-loading subtitle files and clipping media.
  - `Renderer`s that render individual components of the media. The library provides default implementations for common media types (`MediaCodecVideoRenderer`, `MediaCodecAudioRenderer`, `TextRenderer` and `MetadataRenderer`). A Renderer consumes media from the MediaSource being played. Renderers are injected when the player is created. The number of renderers and their respective track types can be obtained by calling `getRendererCount()` and `getRendererType(int)`.
  - A `TrackSelector` that selects tracks provided by the MediaSource to be consumed by each of the available Renderers. The library provides a default implementation (`DefaultTrackSelector`) suitable for most use cases. A TrackSelector is injected when the player is created.
  - A `LoadControl` that controls when the MediaSource buffers more media, and how much media is buffered. The library provides a default implementation (`DefaultLoadControl`) suitable for most use cases. A LoadControl is injected when the player is created.

  An ExoPlayer can be built using the default components provided by the library, but may also be built using custom implementations if non-standard behaviors are required. For example a custom LoadControl could be injected to change the player's buffering strategy, or a custom Renderer could be injected to add support for a video codec not supported natively by Android.

  The concept of injecting components that implement pieces of player functionality is present throughout the library. The default component implementations listed above delegate work to further injected components. This allows many sub-components to be individually replaced with custom implementations. For example the default MediaSource implementations require one or more `DataSource` factories to be injected via their constructors. By providing a custom factory it's possible to load data from a non-standard source, or through a different network stack.

  ## Threading model

  The figure below shows ExoPlayer's threading model.

  - ExoPlayer instances must be accessed from a single application thread unless indicated otherwise. For the vast majority of cases this should be the application's main thread. Using the application's main thread is also a requirement when using ExoPlayer's UI components or the IMA extension. The thread on which an ExoPlayer instance must be accessed can be explicitly specified by passing a `Looper` when creating the player. If no `Looper` is specified, then the `Looper` of the thread that the player is created on is used, or if that thread does not have a `Looper`, the `Looper` of the application's main thread is used. In all cases the `Looper` of the thread from which the player must be accessed can be queried using `Player.getApplicationLooper()`.
  - Registered listeners are called on the thread associated with `Player.getApplicationLooper()`. Note that this means registered listeners are called on the same thread which must be used to access the player.
  - An internal playback thread is responsible for playback. Injected player components such as Renderers, MediaSources, TrackSelectors and LoadControls are called by the player on this thread.
  - When the application performs an operation on the player, for example a seek, a message is delivered to the internal playback thread via a message queue. The internal playback thread consumes messages from the queue and performs the corresponding operations. Similarly, when a playback event occurs on the internal playback thread, a message is delivered to the application thread via a second message queue. The application thread consumes messages from the queue, updating the application visible state and calling corresponding listener methods.
  - Injected player components may use additional background threads. For example a MediaSource may use background threads to load data. These are implementation specific.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Interface | Description
    --- | --- | ---
    `static interface` | `ExoPlayer.AudioComponent` | Deprecated. Use `ExoPlayer`, as the `ExoPlayer.AudioComponent` methods are defined by that interface.
    `static interface` | `ExoPlayer.AudioOffloadListener` | A listener for audio offload events.
    `static class` | `ExoPlayer.Builder` | A builder for `ExoPlayer` instances.
    `static interface` | `ExoPlayer.DeviceComponent` | Deprecated. Use `Player`, as the `ExoPlayer.DeviceComponent` methods are defined by that interface.
    `static interface` | `ExoPlayer.TextComponent` | Deprecated. Use `Player`, as the `ExoPlayer.TextComponent` methods are defined by that interface.
    `static interface` | `ExoPlayer.VideoComponent` | Deprecated. Use `ExoPlayer`, as the `ExoPlayer.VideoComponent` methods are defined by that interface.

    - ### Nested classes/interfaces inherited from interface com.google.android.exoplayer2.Player

      `Player.Command, Player.Commands, Player.DiscontinuityReason, Player.Event, Player.Events, Player.Listener, Player.MediaItemTransitionReason, Player.PlaybackSuppressionReason, Player.PlayWhenReadyChangeReason, Player.PositionInfo, Player.RepeatMode, Player.State, Player.TimelineChangeReason`

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static long` | `DEFAULT_DETACH_SURFACE_TIMEOUT_MS` | The default timeout for detaching a surface from the player, in milliseconds.
    `static long` | `DEFAULT_RELEASE_TIMEOUT_MS` | The default timeout for calls to `Player.release()` and `setForegroundMode(boolean)`, in milliseconds.

    - ### Fields inherited from interface com.google.android.exoplayer2.Player

      `COMMAND_ADJUST_DEVICE_VOLUME, COMMAND_CHANGE_MEDIA_ITEMS, COMMAND_GET_AUDIO_ATTRIBUTES, COMMAND_GET_CURRENT_MEDIA_ITEM, COMMAND_GET_DEVICE_VOLUME, COMMAND_GET_MEDIA_ITEMS_METADATA, COMMAND_GET_TEXT, COMMAND_GET_TIMELINE, COMMAND_GET_TRACKS, COMMAND_GET_VOLUME, COMMAND_INVALID, COMMAND_PLAY_PAUSE, COMMAND_PREPARE, COMMAND_SEEK_BACK, COMMAND_SEEK_FORWARD, COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM, COMMAND_SEEK_IN_CURRENT_WINDOW, COMMAND_SEEK_TO_DEFAULT_POSITION, COMMAND_SEEK_TO_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT, COMMAND_SEEK_TO_NEXT_MEDIA_ITEM, COMMAND_SEEK_TO_NEXT_WINDOW, COMMAND_SEEK_TO_PREVIOUS, COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM, COMMAND_SEEK_TO_PREVIOUS_WINDOW, COMMAND_SEEK_TO_WINDOW, COMMAND_SET_DEVICE_VOLUME, COMMAND_SET_MEDIA_ITEM, COMMAND_SET_MEDIA_ITEMS_METADATA, COMMAND_SET_REPEAT_MODE, COMMAND_SET_SHUFFLE_MODE, COMMAND_SET_SPEED_AND_PITCH, COMMAND_SET_TRACK_SELECTION_PARAMETERS, COMMAND_SET_VIDEO_SURFACE, COMMAND_SET_VOLUME, COMMAND_STOP, DISCONTINUITY_REASON_AUTO_TRANSITION, DISCONTINUITY_REASON_INTERNAL, DISCONTINUITY_REASON_REMOVE, DISCONTINUITY_REASON_SEEK, DISCONTINUITY_REASON_SEEK_ADJUSTMENT, DISCONTINUITY_REASON_SKIP, EVENT_AUDIO_ATTRIBUTES_CHANGED, EVENT_AUDIO_SESSION_ID, EVENT_AVAILABLE_COMMANDS_CHANGED, EVENT_CUES, EVENT_DEVICE_INFO_CHANGED, EVENT_DEVICE_VOLUME_CHANGED, EVENT_IS_LOADING_CHANGED, EVENT_IS_PLAYING_CHANGED, EVENT_MAX_SEEK_TO_PREVIOUS_POSITION_CHANGED, EVENT_MEDIA_ITEM_TRANSITION, EVENT_MEDIA_METADATA_CHANGED, EVENT_METADATA, EVENT_PLAY_WHEN_READY_CHANGED, EVENT_PLAYBACK_PARAMETERS_CHANGED, EVENT_PLAYBACK_STATE_CHANGED, EVENT_PLAYBACK_SUPPRESSION_REASON_CHANGED, EVENT_PLAYER_ERROR, EVENT_PLAYLIST_METADATA_CHANGED, EVENT_POSITION_DISCONTINUITY, EVENT_RENDERED_FIRST_FRAME, EVENT_REPEAT_MODE_CHANGED, EVENT_SEEK_BACK_INCREMENT_CHANGED, EVENT_SEEK_FORWARD_INCREMENT_CHANGED, EVENT_SHUFFLE_MODE_ENABLED_CHANGED, EVENT_SKIP_SILENCE_ENABLED_CHANGED, EVENT_SURFACE_SIZE_CHANGED, EVENT_TIMELINE_CHANGED, EVENT_TRACK_SELECTION_PARAMETERS_CHANGED, EVENT_TRACKS_CHANGED, EVENT_VIDEO_SIZE_CHANGED, EVENT_VOLUME_CHANGED, MEDIA_ITEM_TRANSITION_REASON_AUTO, MEDIA_ITEM_TRANSITION_REASON_PLAYLIST_CHANGED, MEDIA_ITEM_TRANSITION_REASON_REPEAT, MEDIA_ITEM_TRANSITION_REASON_SEEK, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_BECOMING_NOISY, PLAY_WHEN_READY_CHANGE_REASON_AUDIO_FOCUS_LOSS, PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM, PLAY_WHEN_READY_CHANGE_REASON_REMOTE, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST, PLAYBACK_SUPPRESSION_REASON_NONE, PLAYBACK_SUPPRESSION_REASON_TRANSIENT_AUDIO_FOCUS_LOSS, REPEAT_MODE_ALL, REPEAT_MODE_OFF, REPEAT_MODE_ONE, STATE_BUFFERING, STATE_ENDED, STATE_IDLE, STATE_READY, TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, TIMELINE_CHANGE_REASON_SOURCE_UPDATE`

  - ### Method Summary

    All Methods Instance Methods Abstract Methods Deprecated Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `void` | `addAnalyticsListener​(AnalyticsListener listener)` | Adds an `AnalyticsListener` to receive analytics events.
    `void` | `addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)` | Adds a listener to receive audio offload events.
    `void` | `addMediaSource​(int index, MediaSource mediaSource)` | Adds a media source at the given index of the playlist.
    `void` | `addMediaSource​(MediaSource mediaSource)` | Adds a media source to the end of the playlist.
    `void` | `addMediaSources​(int index, List<MediaSource> mediaSources)` | Adds a list of media sources at the given index of the playlist.
    `void` | `addMediaSources​(List<MediaSource> mediaSources)` | Adds a list of media sources to the end of the playlist.
    `void` | `clearAuxEffectInfo()` | Detaches any previously attached auxiliary audio effect from the underlying audio track.
    `void` | `clearCameraMotionListener​(CameraMotionListener listener)` | Clears the listener which receives camera motion events if it matches the one passed.
    `void` | `clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)` | Clears the listener which receives video frame metadata events if it matches the one passed.
    `PlayerMessage` | `createMessage​(PlayerMessage.Target target)` | Creates a message that can be sent to a `PlayerMessage.Target`.
    `boolean` | `experimentalIsSleepingForOffload()` | Returns whether the player has paused its main loop to save power in offload scheduling mode.
    `void` | `experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled)` | Sets whether audio offload scheduling is enabled.
    `AnalyticsCollector` | `getAnalyticsCollector()` | Returns the `AnalyticsCollector` used for collecting analytics events.
    `ExoPlayer.AudioComponent` | `getAudioComponent()` | Deprecated. Use `ExoPlayer`, as the `ExoPlayer.AudioComponent` methods are defined by that interface.
    `DecoderCounters` | `getAudioDecoderCounters()` | Returns `DecoderCounters` for audio, or null if no audio is being played.
    `Format` | `getAudioFormat()` | Returns the audio format currently being played, or null if no audio is being played.
    `int` | `getAudioSessionId()` | Returns the audio session identifier, or `C.AUDIO_SESSION_ID_UNSET` if not set.
    `Clock` | `getClock()` | Returns the `Clock` used for playback.
    `TrackGroupArray` | `getCurrentTrackGroups()` | Deprecated. Use `Player.getCurrentTracks()`.
    `TrackSelectionArray` | `getCurrentTrackSelections()` | Deprecated. Use `Player.getCurrentTracks()`.
    `ExoPlayer.DeviceComponent` | `getDeviceComponent()` | Deprecated. Use `Player`, as the `ExoPlayer.DeviceComponent` methods are defined by that interface.
    `boolean` | `getPauseAtEndOfMediaItems()` | Returns whether the player pauses playback at the end of each media item.
    `Looper` | `getPlaybackLooper()` | Returns the `Looper` associated with the playback thread.
    `ExoPlaybackException` | `getPlayerError()` | Equivalent to `Player.getPlayerError()`, except the exception is guaranteed to be an `ExoPlaybackException`.
    `Renderer` | `getRenderer​(int index)` | Returns the renderer at the given index.
    `int` | `getRendererCount()` | Returns the number of renderers.
    `@com.google.android.exoplayer2.C.TrackType int` | `getRendererType​(int index)` | Returns the track type that the renderer at a given index handles.
    `SeekParameters` | `getSeekParameters()` | Returns the currently active `SeekParameters` of the player.
    `boolean` | `getSkipSilenceEnabled()` | Returns whether skipping silences in the audio stream is enabled.
    `ExoPlayer.TextComponent` | `getTextComponent()` | Deprecated. Use `Player`, as the `ExoPlayer.TextComponent` methods are defined by that interface.
    `TrackSelector` | `getTrackSelector()` | Returns the track selector that this player uses, or null if track selection is not supported.
    `@com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy int` | `getVideoChangeFrameRateStrategy()` | Returns the `C.VideoChangeFrameRateStrategy`.
    `ExoPlayer.VideoComponent` | `getVideoComponent()` | Deprecated. Use `ExoPlayer`, as the `ExoPlayer.VideoComponent` methods are defined by that interface.
    `DecoderCounters` | `getVideoDecoderCounters()` | Returns `DecoderCounters` for video, or null if no video is being played.
    `Format` | `getVideoFormat()` | Returns the video format currently being played, or null if no video is being played.
    `@com.google.android.exoplayer2.C.VideoScalingMode int` | `getVideoScalingMode()` | Returns the `C.VideoScalingMode`.
    `boolean` | `isTunnelingEnabled()` | Returns whether tunneling is enabled for the currently selected tracks.
    `void` | `prepare​(MediaSource mediaSource)` | Deprecated. Use `setMediaSource(MediaSource)` and `Player.prepare()` instead.
    `void` | `prepare​(MediaSource mediaSource, boolean resetPosition, boolean resetState)` | Deprecated. Use `setMediaSource(MediaSource, boolean)` and `Player.prepare()` instead.
    `void` | `removeAnalyticsListener​(AnalyticsListener listener)` | Removes an `AnalyticsListener`.
    `void` | `removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)` | Removes a listener of audio offload events.
    `void` | `retry()` | Deprecated. Use `Player.prepare()` instead.
    `void` | `setAudioAttributes​(AudioAttributes audioAttributes, boolean handleAudioFocus)` | Sets the attributes for audio playback, used by the underlying audio track.
    `void` | `setAudioSessionId​(int audioSessionId)` | Sets the ID of the audio session to attach to the underlying `AudioTrack`.
    `void` | `setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)` | Sets information on an auxiliary audio effect to attach to the underlying audio track.
    `void` | `setCameraMotionListener​(CameraMotionListener listener)` | Sets a listener of camera motion events.
    `void` | `setForegroundMode​(boolean foregroundMode)` | Sets whether the player is allowed to keep holding limited resources such as video decoders, even when in the idle state.
    `void` | `setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)` | Sets whether the player should pause automatically when audio is rerouted from a headset to device speakers.
    `void` | `setHandleWakeLock​(boolean handleWakeLock)` | Deprecated. Use `setWakeMode(int)` instead.
    `void` | `setMediaSource​(MediaSource mediaSource)` | Clears the playlist, adds the specified `MediaSource` and resets the position to the default position.
    `void` | `setMediaSource​(MediaSource mediaSource, boolean resetPosition)` | Clears the playlist and adds the specified `MediaSource`.
    `void` | `setMediaSource​(MediaSource mediaSource, long startPositionMs)` | Clears the playlist and adds the specified `MediaSource`.
    `void` | `setMediaSources​(List<MediaSource> mediaSources)` | Clears the playlist, adds the specified `MediaSources` and resets the position to the default position.
    `void` | `setMediaSources​(List<MediaSource> mediaSources, boolean resetPosition)` | Clears the playlist and adds the specified `MediaSources`.
    `void` | `setMediaSources​(List<MediaSource> mediaSources, int startMediaItemIndex, long startPositionMs)` | Clears the playlist and adds the specified `MediaSources`.
    `void` | `setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)` | Sets whether to pause playback at the end of each media item.
    `void` | `setPreferredAudioDevice​(AudioDeviceInfo audioDeviceInfo)` | Sets the preferred audio device.
    `void` | `setPriorityTaskManager​(PriorityTaskManager priorityTaskManager)` | Sets a `PriorityTaskManager`, or null to clear a previously set priority task manager.
    `void` | `setSeekParameters​(SeekParameters seekParameters)` | Sets the parameters that control how seek operations are performed.
    `void` | `setShuffleOrder​(ShuffleOrder shuffleOrder)` | Sets the shuffle order.
    `void` | `setSkipSilenceEnabled​(boolean skipSilenceEnabled)` | Sets whether skipping silences in the audio stream is enabled.
    `void` | `setVideoChangeFrameRateStrategy​(@com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy)` | Sets a `C.VideoChangeFrameRateStrategy` that will be used by the player when provided with a video output `Surface`.
    `void` | `setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)` | Sets a listener to receive video frame metadata events.
    `void` | `setVideoScalingMode​(@com.google.android.exoplayer2.C.VideoScalingMode int videoScalingMode)` | Sets the `C.VideoScalingMode`.
    `void` | `setWakeMode​(@com.google.android.exoplayer2.C.WakeMode int wakeMode)` | Sets how the player should keep the device awake for playback when the screen is off.

    - ### Methods inherited from interface com.google.android.exoplayer2.Player

      `addListener, addMediaItem, addMediaItem, addMediaItems, addMediaItems, canAdvertiseSession, clearMediaItems, clearVideoSurface, clearVideoSurface, clearVideoSurfaceHolder, clearVideoSurfaceView, clearVideoTextureView, decreaseDeviceVolume, getApplicationLooper, getAudioAttributes, getAvailableCommands, getBufferedPercentage, getBufferedPosition, getContentBufferedPosition, getContentDuration, getContentPosition, getCurrentAdGroupIndex, getCurrentAdIndexInAdGroup, getCurrentCues, getCurrentLiveOffset, getCurrentManifest, getCurrentMediaItem, getCurrentMediaItemIndex, getCurrentPeriodIndex, getCurrentPosition, getCurrentTimeline, getCurrentTracks, getCurrentWindowIndex, getDeviceInfo, getDeviceVolume, getDuration, getMaxSeekToPreviousPosition, getMediaItemAt, getMediaItemCount, getMediaMetadata, getNextMediaItemIndex, getNextWindowIndex, getPlaybackParameters, getPlaybackState, getPlaybackSuppressionReason, getPlaylistMetadata, getPlayWhenReady, getPreviousMediaItemIndex, getPreviousWindowIndex, getRepeatMode, getSeekBackIncrement, getSeekForwardIncrement, getShuffleModeEnabled, getSurfaceSize, getTotalBufferedDuration, getTrackSelectionParameters, getVideoSize, getVolume, hasNext, hasNextMediaItem, hasNextWindow, hasPrevious, hasPreviousMediaItem, hasPreviousWindow, increaseDeviceVolume, isCommandAvailable, isCurrentMediaItemDynamic, isCurrentMediaItemLive, isCurrentMediaItemSeekable, isCurrentWindowDynamic, isCurrentWindowLive, isCurrentWindowSeekable, isDeviceMuted, isLoading, isPlaying, isPlayingAd, moveMediaItem, moveMediaItems, next, pause, play, prepare, previous, release, removeListener, removeMediaItem, removeMediaItems, seekBack, seekForward, seekTo, seekTo, seekToDefaultPosition, seekToDefaultPosition, seekToNext, seekToNextMediaItem, seekToNextWindow, seekToPrevious, seekToPreviousMediaItem, seekToPreviousWindow, setDeviceMuted, setDeviceVolume, setMediaItem, setMediaItem, setMediaItem, setMediaItems, setMediaItems, setMediaItems, setPlaybackParameters, setPlaybackSpeed, setPlaylistMetadata, setPlayWhenReady, setRepeatMode, setShuffleModeEnabled, setTrackSelectionParameters, setVideoSurface, setVideoSurfaceHolder, setVideoSurfaceView, setVideoTextureView, setVolume, stop, stop`

- - ### Field Detail

    - #### DEFAULT_RELEASE_TIMEOUT_MS

          static final long DEFAULT_RELEASE_TIMEOUT_MS

      The default timeout for calls to `Player.release()` and `setForegroundMode(boolean)`, in milliseconds.
      See Also:
        Constant Field Values

    - #### DEFAULT_DETACH_SURFACE_TIMEOUT_MS

          static final long DEFAULT_DETACH_SURFACE_TIMEOUT_MS

      The default timeout for detaching a surface from the player, in milliseconds.
      See Also:
        Constant Field Values

  - ### Method Detail

    - #### getPlayerError

          @Nullable
          ExoPlaybackException getPlayerError()

      Equivalent to `Player.getPlayerError()`, except the exception is guaranteed to be an `ExoPlaybackException`.
      Specified by:
        `getPlayerError` in interface `Player`
      Returns:
        The error, or `null`.
      See Also:
        `Player.Listener.onPlayerError(PlaybackException)`

    - #### getAudioComponent

          @Nullable
          @Deprecated
          ExoPlayer.AudioComponent getAudioComponent()

      Deprecated.
      Use `ExoPlayer`, as the `ExoPlayer.AudioComponent` methods are defined by that interface.

    - #### getVideoComponent

          @Nullable
          @Deprecated
          ExoPlayer.VideoComponent getVideoComponent()

      Deprecated.
      Use `ExoPlayer`, as the `ExoPlayer.VideoComponent` methods are defined by that interface.

    - #### getTextComponent

          @Nullable
          @Deprecated
          ExoPlayer.TextComponent getTextComponent()

      Deprecated.
      Use `Player`, as the `ExoPlayer.TextComponent` methods are defined by that interface.

    - #### getDeviceComponent

          @Nullable
          @Deprecated
          ExoPlayer.DeviceComponent getDeviceComponent()

      Deprecated.
      Use `Player`, as the `ExoPlayer.DeviceComponent` methods are defined by that interface.

    - #### addAudioOffloadListener

          void addAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)

      Adds a listener to receive audio offload events.

      This method can be called from any thread.

      Parameters:
        `listener` - The listener to register.

    - #### removeAudioOffloadListener

          void removeAudioOffloadListener​(ExoPlayer.AudioOffloadListener listener)

      Removes a listener of audio offload events.
      Parameters:
        `listener` - The listener to unregister.

    - #### getAnalyticsCollector

          AnalyticsCollector getAnalyticsCollector()

      Returns the `AnalyticsCollector` used for collecting analytics events.

    - #### addAnalyticsListener

          void addAnalyticsListener​(AnalyticsListener listener)

      Adds an `AnalyticsListener` to receive analytics events.

      This method can be called from any thread.

      Parameters:
        `listener` - The listener to be added.

    - #### removeAnalyticsListener

          void removeAnalyticsListener​(AnalyticsListener listener)

      Removes an `AnalyticsListener`.
      Parameters:
        `listener` - The listener to be removed.

    - #### getRendererCount

          int getRendererCount()

      Returns the number of renderers.

    - #### getRendererType

          @com.google.android.exoplayer2.C.TrackType int getRendererType​(int index)

      Returns the track type that the renderer at a given index handles.

      For example, a video renderer will return `C.TRACK_TYPE_VIDEO`, an audio renderer will return `C.TRACK_TYPE_AUDIO` and a text renderer will return `C.TRACK_TYPE_TEXT`.

      Parameters:
        `index` - The index of the renderer.
      Returns:
        The `track type` that the renderer handles.

    - #### getRenderer

          Renderer getRenderer​(int index)

      Returns the renderer at the given index.
      Parameters:
        `index` - The index of the renderer.
      Returns:
        The renderer at this index.

    - #### getTrackSelector

          @Nullable
          TrackSelector getTrackSelector()

      Returns the track selector that this player uses, or null if track selection is not supported.

    - #### getCurrentTrackGroups

          @Deprecated
          TrackGroupArray getCurrentTrackGroups()

      Deprecated.
      Use `Player.getCurrentTracks()`.
      Returns the available track groups.
      See Also:
        `Player.Listener.onTracksChanged(Tracks)`

    - #### getCurrentTrackSelections

          @Deprecated
          TrackSelectionArray getCurrentTrackSelections()

      Deprecated.
      Use `Player.getCurrentTracks()`.
      Returns the current track selections for each renderer, which may include `null` elements if some renderers do not have any selected tracks.
      See Also:
        `Player.Listener.onTracksChanged(Tracks)`

    - #### getPlaybackLooper

          Looper getPlaybackLooper()

      Returns the `Looper` associated with the playback thread.

      This method may be called from any thread.

    - #### getClock

          Clock getClock()

      Returns the `Clock` used for playback.

      This method can be called from any thread.

    - #### retry

          @Deprecated
          void retry()

      Deprecated.
      Use `Player.prepare()` instead.

    - #### prepare

          @Deprecated
          void prepare​(MediaSource mediaSource)

      Deprecated.
      Use `setMediaSource(MediaSource)` and `Player.prepare()` instead.

    - #### prepare

          @Deprecated
          void prepare​(MediaSource mediaSource,
                       boolean resetPosition,
                       boolean resetState)

      Deprecated.
      Use `setMediaSource(MediaSource, boolean)` and `Player.prepare()` instead.

    - #### setMediaSources

          void setMediaSources​(List<MediaSource> mediaSources)

      Clears the playlist, adds the specified `MediaSources` and resets the position to the default position.
      Parameters:
        `mediaSources` - The new `MediaSources`.

    - #### setMediaSources

          void setMediaSources​(List<MediaSource> mediaSources,
                               boolean resetPosition)

      Clears the playlist and adds the specified `MediaSources`.
      Parameters:
        `mediaSources` - The new `MediaSources`.
        `resetPosition` - Whether the playback position should be reset to the default position in the first `Timeline.Window`. If false, playback will start from the position defined by `Player.getCurrentMediaItemIndex()` and `Player.getCurrentPosition()`.

    - #### setMediaSources

          void setMediaSources​(List<MediaSource> mediaSources,
                               int startMediaItemIndex,
                               long startPositionMs)

      Clears the playlist and adds the specified `MediaSources`.
      Parameters:
        `mediaSources` - The new `MediaSources`.
        `startMediaItemIndex` - The media item index to start playback from. If `C.INDEX_UNSET` is passed, the current position is not reset.
        `startPositionMs` - The position in milliseconds to start playback from. If `C.TIME_UNSET` is passed, the default position of the given media item is used. In any case, if `startMediaItemIndex` is set to `C.INDEX_UNSET`, this parameter is ignored and the position is not reset at all.

    - #### setMediaSource

          void setMediaSource​(MediaSource mediaSource)

      Clears the playlist, adds the specified `MediaSource` and resets the position to the default position.
      Parameters:
        `mediaSource` - The new `MediaSource`.

    - #### setMediaSource

          void setMediaSource​(MediaSource mediaSource,
                              long startPositionMs)

      Clears the playlist and adds the specified `MediaSource`.
      Parameters:
        `mediaSource` - The new `MediaSource`.
        `startPositionMs` - The position in milliseconds to start playback from.

    - #### setMediaSource

          void setMediaSource​(MediaSource mediaSource,
                              boolean resetPosition)

      Clears the playlist and adds the specified `MediaSource`.
      Parameters:
        `mediaSource` - The new `MediaSource`.
        `resetPosition` - Whether the playback position should be reset to the default position. If false, playback will start from the position defined by `Player.getCurrentMediaItemIndex()` and `Player.getCurrentPosition()`.

    - #### addMediaSource

          void addMediaSource​(MediaSource mediaSource)

      Adds a media source to the end of the playlist.
      Parameters:
        `mediaSource` - The `MediaSource` to add.

    - #### addMediaSource

          void addMediaSource​(int index,
                              MediaSource mediaSource)

      Adds a media source at the given index of the playlist.
      Parameters:
        `index` - The index at which to add the source.
        `mediaSource` - The `MediaSource` to add.

    - #### addMediaSources

          void addMediaSources​(List<MediaSource> mediaSources)

      Adds a list of media sources to the end of the playlist.
      Parameters:
        `mediaSources` - The `MediaSources` to add.

    - #### addMediaSources

          void addMediaSources​(int index,
                               List<MediaSource> mediaSources)

      Adds a list of media sources at the given index of the playlist.
      Parameters:
        `index` - The index at which to add the media sources.
        `mediaSources` - The `MediaSources` to add.

    - #### setShuffleOrder

          void setShuffleOrder​(ShuffleOrder shuffleOrder)

      Sets the shuffle order.
      Parameters:
        `shuffleOrder` - The shuffle order.

    - #### setAudioAttributes

          void setAudioAttributes​(AudioAttributes audioAttributes,
                                  boolean handleAudioFocus)

      Sets the attributes for audio playback, used by the underlying audio track. If not set, the default audio attributes will be used. They are suitable for general media playback.

      Setting the audio attributes during playback may introduce a short gap in audio output as the audio track is recreated. A new audio session id will also be generated.

      If tunneling is enabled by the track selector, the specified audio attributes will be ignored, but they will take effect if audio is later played without tunneling.

      If the device is running a build before platform API version 21, audio attributes cannot be set directly on the underlying audio track. In this case, the usage will be mapped onto an equivalent stream type using `Util.getStreamTypeForAudioUsage(int)`.

      If audio focus should be handled, the `AudioAttributes.usage` must be `C.USAGE_MEDIA` or `C.USAGE_GAME`. Other usages will throw an `IllegalArgumentException`.

      Parameters:
        `audioAttributes` - The attributes to use for audio playback.
        `handleAudioFocus` - True if the player should handle audio focus, false otherwise.

    - #### setAudioSessionId

          void setAudioSessionId​(int audioSessionId)

      Sets the ID of the audio session to attach to the underlying `AudioTrack`.

      The audio session ID can be generated using `Util.generateAudioSessionIdV21(Context)` for API 21+.

      Parameters:
        `audioSessionId` - The audio session ID, or `C.AUDIO_SESSION_ID_UNSET` if it should be generated by the framework.

    - #### getAudioSessionId

          int getAudioSessionId()

      Returns the audio session identifier, or `C.AUDIO_SESSION_ID_UNSET` if not set.

    - #### setAuxEffectInfo

          void setAuxEffectInfo​(AuxEffectInfo auxEffectInfo)

      Sets information on an auxiliary audio effect to attach to the underlying audio track.

    - #### clearAuxEffectInfo

          void clearAuxEffectInfo()

      Detaches any previously attached auxiliary audio effect from the underlying audio track.

    - #### setPreferredAudioDevice

          @RequiresApi(23)
          void setPreferredAudioDevice​(@Nullable
                                       AudioDeviceInfo audioDeviceInfo)

      Sets the preferred audio device.
      Parameters:
        `audioDeviceInfo` - The preferred audio device, or null to restore the default.

    - #### setSkipSilenceEnabled

          void setSkipSilenceEnabled​(boolean skipSilenceEnabled)

      Sets whether skipping silences in the audio stream is enabled.
      Parameters:
        `skipSilenceEnabled` - Whether skipping silences in the audio stream is enabled.

    - #### getSkipSilenceEnabled

          boolean getSkipSilenceEnabled()

      Returns whether skipping silences in the audio stream is enabled.

    - #### setVideoScalingMode

          void setVideoScalingMode​(@VideoScalingMode
                                   @com.google.android.exoplayer2.C.VideoScalingMode int videoScalingMode)

      Sets the `C.VideoScalingMode`.

      The scaling mode only applies if a `MediaCodec`-based video `Renderer` is enabled and if the output surface is owned by a `SurfaceView`.

      Parameters:
        `videoScalingMode` - The `C.VideoScalingMode`.

    - #### getVideoScalingMode

          @VideoScalingMode
          @com.google.android.exoplayer2.C.VideoScalingMode int getVideoScalingMode()

      Returns the `C.VideoScalingMode`.

    - #### setVideoChangeFrameRateStrategy

          void setVideoChangeFrameRateStrategy​(@VideoChangeFrameRateStrategy
                                               @com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy)

      Sets a `C.VideoChangeFrameRateStrategy` that will be used by the player when provided with a video output `Surface`.

      The strategy only applies if a `MediaCodec`-based video `Renderer` is enabled. Applications wishing to use `Surface.CHANGE_FRAME_RATE_ALWAYS` should set the mode to `C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_OFF` to disable calls to `Surface.setFrameRate(float, int, int)` from ExoPlayer, and should then call `Surface.setFrameRate(float, int, int)` directly from application code.

      Parameters:
        `videoChangeFrameRateStrategy` - A `C.VideoChangeFrameRateStrategy`.

    - #### getVideoChangeFrameRateStrategy

          @VideoChangeFrameRateStrategy
          @com.google.android.exoplayer2.C.VideoChangeFrameRateStrategy int getVideoChangeFrameRateStrategy()

      Returns the `C.VideoChangeFrameRateStrategy`.

    - #### setVideoFrameMetadataListener

          void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)

      Sets a listener to receive video frame metadata events.

      This method is intended to be called by the same component that sets the `Surface` onto which video will be rendered. If using ExoPlayer's standard UI components, this method should not be called directly from application code.

      Parameters:
        `listener` - The listener.

    - #### clearVideoFrameMetadataListener

          void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)

      Clears the listener which receives video frame metadata events if it matches the one passed. Else does nothing.
      Parameters:
        `listener` - The listener to clear.

    - #### setCameraMotionListener

          void setCameraMotionListener​(CameraMotionListener listener)

      Sets a listener of camera motion events.
      Parameters:
        `listener` - The listener.

    - #### clearCameraMotionListener

          void clearCameraMotionListener​(CameraMotionListener listener)

      Clears the listener which receives camera motion events if it matches the one passed. Else does nothing.
      Parameters:
        `listener` - The listener to clear.

    - #### createMessage

          PlayerMessage createMessage​(PlayerMessage.Target target)

      Creates a message that can be sent to a `PlayerMessage.Target`. By default, the message will be delivered immediately without blocking on the playback thread. The default `PlayerMessage.getType()` is 0 and the default `PlayerMessage.getPayload()` is null. If a position is specified with `PlayerMessage.setPosition(long)`, the message will be delivered at this position in the current media item defined by `Player.getCurrentMediaItemIndex()`. Alternatively, the message can be sent at a specific mediaItem using `PlayerMessage.setPosition(int, long)`.

    - #### setSeekParameters

          void setSeekParameters​(@Nullable
                                 SeekParameters seekParameters)

      Sets the parameters that control how seek operations are performed.
      Parameters:
        `seekParameters` - The seek parameters, or `null` to use the defaults.

    - #### getSeekParameters

          SeekParameters getSeekParameters()

      Returns the currently active `SeekParameters` of the player.

    - #### setForegroundMode

          void setForegroundMode​(boolean foregroundMode)

      Sets whether the player is allowed to keep holding limited resources such as video decoders, even when in the idle state. By doing so, the player may be able to reduce latency when starting to play another piece of content for which the same resources are required.

      This mode should be used with caution, since holding limited resources may prevent other players of media components from acquiring them. It should only be enabled when both of the following conditions are true:

      - The application that owns the player is in the foreground.
      - The player is used in a way that may benefit from foreground mode. For this to be true, the same player instance must be used to play multiple pieces of content, and there must be gaps between the playbacks (i.e. `Player.stop()` is called to halt one playback, and `prepare(com.google.android.exoplayer2.source.MediaSource)` is called some time later to start a new one).

      Note that foreground mode is not useful for switching between content without gaps between the playbacks. For this use case `Player.stop()` does not need to be called, and simply calling `prepare(com.google.android.exoplayer2.source.MediaSource)` for the new media will cause limited resources to be retained even if foreground mode is not enabled.

      If foreground mode is enabled, it's the application's responsibility to disable it when the conditions described above no longer hold.

      Parameters:
        `foregroundMode` - Whether the player is allowed to keep limited resources even when in the idle state.

    - #### setPauseAtEndOfMediaItems

          void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)

      Sets whether to pause playback at the end of each media item.

      This means the player will pause at the end of each window in the current `timeline`. Listeners will be informed by a call to `Player.Listener.onPlayWhenReadyChanged(boolean, int)` with the reason `Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM` when this happens.

      Parameters:
        `pauseAtEndOfMediaItems` - Whether to pause playback at the end of each media item.

    - #### getPauseAtEndOfMediaItems

          boolean getPauseAtEndOfMediaItems()

      Returns whether the player pauses playback at the end of each media item.
      See Also:
        `setPauseAtEndOfMediaItems(boolean)`

    - #### getAudioFormat

          @Nullable
          Format getAudioFormat()

      Returns the audio format currently being played, or null if no audio is being played.

    - #### getVideoFormat

          @Nullable
          Format getVideoFormat()

      Returns the video format currently being played, or null if no video is being played.

    - #### getAudioDecoderCounters

          @Nullable
          DecoderCounters getAudioDecoderCounters()

      Returns `DecoderCounters` for audio, or null if no audio is being played.

    - #### getVideoDecoderCounters

          @Nullable
          DecoderCounters getVideoDecoderCounters()

      Returns `DecoderCounters` for video, or null if no video is being played.

    - #### setHandleAudioBecomingNoisy

          void setHandleAudioBecomingNoisy​(boolean handleAudioBecomingNoisy)

      Sets whether the player should pause automatically when audio is rerouted from a headset to device speakers. See the audio becoming noisy documentation for more information.
      Parameters:
        `handleAudioBecomingNoisy` - Whether the player should pause automatically when audio is rerouted from a headset to device speakers.

    - #### setHandleWakeLock

          @Deprecated
          void setHandleWakeLock​(boolean handleWakeLock)

      Deprecated.
      Use `setWakeMode(int)` instead.

    - #### setWakeMode

          void setWakeMode​(@WakeMode
                           @com.google.android.exoplayer2.C.WakeMode int wakeMode)

      Sets how the player should keep the device awake for playback when the screen is off.

      Enabling this feature requires the `Manifest.permission.WAKE_LOCK` permission. It should be used together with a foreground `Service` for use cases where playback occurs and the screen is off (e.g. background audio playback). It is not useful when the screen will be kept on during playback (e.g. foreground video playback).

      When enabled, the locks (`PowerManager.WakeLock` / `WifiManager.WifiLock`) will be held whenever the player is in the `Player.STATE_READY` or `Player.STATE_BUFFERING` states with `playWhenReady = true`. The locks held depends on the specified `C.WakeMode`.

      Parameters:
        `wakeMode` - The `C.WakeMode` option to keep the device awake during playback.

    - #### setPriorityTaskManager

          void setPriorityTaskManager​(@Nullable
                                      PriorityTaskManager priorityTaskManager)

      Sets a `PriorityTaskManager`, or null to clear a previously set priority task manager.

      The priority `C.PRIORITY_PLAYBACK` will be set while the player is loading.

      Parameters:
        `priorityTaskManager` - The `PriorityTaskManager`, or null to clear a previously set priority task manager.

    - #### experimentalSetOffloadSchedulingEnabled

          void experimentalSetOffloadSchedulingEnabled​(boolean offloadSchedulingEnabled)

      Sets whether audio offload scheduling is enabled. If enabled, ExoPlayer's main loop will run as rarely as possible when playing an audio stream using audio offload.

      Only use this scheduling mode if the player is not displaying anything to the user. For example when the application is in the background, or the screen is off. The player state (including position) is rarely updated (roughly between every 10 seconds and 1 minute).

      While offload scheduling is enabled, player events may be delivered severely delayed and apps should not interact with the player. When returning to the foreground, disable offload scheduling and wait for `ExoPlayer.AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged(boolean)` to be called with `offloadSchedulingEnabled = false` before interacting with the player.

      This mode should save significant power when the phone is playing offload audio with the screen off.

      This mode only has an effect when playing an audio track in offload mode, which requires all the following:

      - Audio offload rendering is enabled in `DefaultRenderersFactory.setEnableAudioOffload(boolean)` or the equivalent option passed to `DefaultAudioSink.Builder.setOffloadMode(@com.google.android.exoplayer2.audio.DefaultAudioSink.OffloadMode int)`.
      - An audio track is playing in a format that the device supports offloading (for example, MP3 or AAC).
      - The `AudioSink` is playing with an offload `AudioTrack`.

      The state where ExoPlayer main loop has been paused to save power during offload playback can be queried with `experimentalIsSleepingForOffload()`.

      This method is experimental, and will be renamed or removed in a future release.

      Parameters:
        `offloadSchedulingEnabled` - Whether to enable offload scheduling.

    - #### experimentalIsSleepingForOffload

          boolean experimentalIsSleepingForOffload()

      Returns whether the player has paused its main loop to save power in offload scheduling mode.
      See Also:
        `experimentalSetOffloadSchedulingEnabled(boolean)`, `ExoPlayer.AudioOffloadListener.onExperimentalSleepingForOffloadChanged(boolean)`

    - #### isTunnelingEnabled

          boolean isTunnelingEnabled()

      Returns whether tunneling is enabled for the currently selected tracks.
      See Also:
        `Player.Listener.onTracksChanged(Tracks)`