or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

analytics.mdaudio-rendering.mdcore-player.mddrm-support.mdindex.mdmedia-sources.mdoffline-support.mdtrack-selection.mdvideo-rendering.md

core-player.mddocs/

0

# Core Player

1

2

The ExoPlayer interface is the main entry point for media playback, providing an extensible architecture for playing MediaSources with full control over playback state, seek operations, and component configuration.

3

4

## ExoPlayer Interface

5

6

The primary interface for media playback that extends the basic Player interface with ExoPlayer-specific functionality.

7

8

```java { .api }

9

public interface ExoPlayer extends Player {

10

// Analytics

11

void addAnalyticsListener(AnalyticsListener listener);

12

void removeAnalyticsListener(AnalyticsListener listener);

13

14

// Audio offload

15

void addAudioOffloadListener(AudioOffloadListener listener);

16

void removeAudioOffloadListener(AudioOffloadListener listener);

17

18

// Renderer access

19

int getRendererCount();

20

@C.TrackType int getRendererType(int index);

21

Renderer getRenderer(int index);

22

23

// Media source management

24

void setMediaSource(MediaSource mediaSource);

25

void setMediaSources(List<MediaSource> mediaSources);

26

void addMediaSource(MediaSource mediaSource);

27

void addMediaSource(int index, MediaSource mediaSource);

28

void addMediaSources(List<MediaSource> mediaSources);

29

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

30

void removeMediaItem(int index);

31

void removeMediaItems(int fromIndex, int toIndex);

32

void moveMediaItem(int currentIndex, int newIndex);

33

void moveMediaItems(int fromIndex, int toIndex, int newIndex);

34

35

// Audio configuration

36

void setAudioSessionId(int audioSessionId);

37

int getAudioSessionId();

38

39

// Video configuration

40

void setVideoEffects(List<Effect> videoEffects);

41

void setVideoScalingMode(@C.VideoScalingMode int videoScalingMode);

42

void setVideoChangeFrameRateStrategy(@C.VideoChangeFrameRateStrategy int videoChangeFrameRateStrategy);

43

44

// Image output

45

void setImageOutput(ImageOutput imageOutput);

46

47

// Message passing

48

PlayerMessage createMessage(PlayerMessage.Target target);

49

50

// Seek configuration

51

void setSeekParameters(SeekParameters seekParameters);

52

53

// Preload configuration

54

void setPreloadConfiguration(PreloadConfiguration preloadConfiguration);

55

PreloadConfiguration getPreloadConfiguration();

56

57

// Scrubbing mode

58

void setScrubbingModeEnabled(boolean scrubbingModeEnabled);

59

boolean isScrubbingModeEnabled();

60

void setScrubbingModeParameters(ScrubbingModeParameters scrubbingModeParameters);

61

ScrubbingModeParameters getScrubbingModeParameters();

62

63

// Playback control

64

void setForegroundMode(boolean foregroundMode);

65

boolean isTunnelingEnabled();

66

boolean isSleepingForOffload();

67

boolean isReleased();

68

69

// Device information

70

DeviceInfo getDeviceInfo();

71

int getDeviceVolume();

72

boolean isDeviceMuted();

73

void setDeviceVolume(int volume, @C.VolumeFlags int flags);

74

void increaseDeviceVolume(@C.VolumeFlags int flags);

75

void decreaseDeviceVolume(@C.VolumeFlags int flags);

76

void setDeviceMuted(boolean muted, @C.VolumeFlags int flags);

77

}

78

```

79

80

## ExoPlayer Builder

81

82

The Builder class provides a fluent interface for constructing ExoPlayer instances with custom components.

83

84

```java { .api }

85

public static final class Builder {

86

/**

87

* Creates a builder with the specified context.

88

*

89

* @param context The context

90

*/

91

public Builder(Context context);

92

93

/**

94

* Sets the RenderersFactory for creating Renderers for the player.

95

*

96

* @param renderersFactory The RenderersFactory

97

* @return This builder

98

*/

99

public Builder setRenderersFactory(RenderersFactory renderersFactory);

100

101

/**

102

* Sets the TrackSelector for selecting tracks to be consumed by the player's renderers.

103

*

104

* @param trackSelector The TrackSelector

105

* @return This builder

106

*/

107

public Builder setTrackSelector(TrackSelector trackSelector);

108

109

/**

110

* Sets the LoadControl that will control when the MediaSource buffers more media.

111

*

112

* @param loadControl The LoadControl

113

* @return This builder

114

*/

115

public Builder setLoadControl(LoadControl loadControl);

116

117

/**

118

* Sets the BandwidthMeter that will be used by the player.

119

*

120

* @param bandwidthMeter The BandwidthMeter

121

* @return This builder

122

*/

123

public Builder setBandwidthMeter(BandwidthMeter bandwidthMeter);

124

125

/**

126

* Sets the AnalyticsCollector that will collect and forward analytics events.

127

*

128

* @param analyticsCollector The AnalyticsCollector

129

* @return This builder

130

*/

131

public Builder setAnalyticsCollector(AnalyticsCollector analyticsCollector);

132

133

/**

134

* Sets the Looper that must be used for all calls to the player.

135

*

136

* @param looper The Looper

137

* @return This builder

138

*/

139

public Builder setLooper(Looper looper);

140

141

/**

142

* Sets the PriorityTaskManager that will be used to prioritize loading.

143

*

144

* @param priorityTaskManager The PriorityTaskManager

145

* @return This builder

146

*/

147

public Builder setPriorityTaskManager(@Nullable PriorityTaskManager priorityTaskManager);

148

149

/**

150

* Sets the Clock that will be used by the player.

151

*

152

* @param clock The Clock

153

* @return This builder

154

*/

155

public Builder setClock(Clock clock);

156

157

/**

158

* Sets whether to use the lazy preparation.

159

*

160

* @param useLazyPreparation Whether to use lazy preparation

161

* @return This builder

162

*/

163

public Builder setUseLazyPreparation(boolean useLazyPreparation);

164

165

/**

166

* Sets the Looper that will be used for playback.

167

*

168

* @param playbackLooper The playback Looper

169

* @return This builder

170

*/

171

public Builder setPlaybackLooper(Looper playbackLooper);

172

173

/**

174

* Sets the player name for identification in PlayerId.

175

*

176

* @param playerName The player name

177

* @return This builder

178

*/

179

public Builder setName(String playerName);

180

181

/**

182

* Sets the foreground mode timeout (experimental).

183

*

184

* @param timeoutMs The timeout in milliseconds

185

* @return This builder

186

*/

187

public Builder experimentalSetForegroundModeTimeoutMs(long timeoutMs);

188

189

/**

190

* Enables dynamic scheduling (experimental).

191

*

192

* @param dynamicSchedulingEnabled Whether to enable dynamic scheduling

193

* @return This builder

194

*/

195

public Builder experimentalSetDynamicSchedulingEnabled(boolean dynamicSchedulingEnabled);

196

197

/**

198

* Sets the MediaSourceFactory to be used by the player.

199

*

200

* @param mediaSourceFactory The MediaSourceFactory

201

* @return This builder

202

*/

203

public Builder setMediaSourceFactory(MediaSource.Factory mediaSourceFactory);

204

205

/**

206

* Builds an ExoPlayer instance.

207

*

208

* @return The built ExoPlayer instance

209

*/

210

public ExoPlayer build();

211

}

212

```

213

214

## Basic Player Construction

215

216

```java

217

// Create with default components

218

ExoPlayer player = new ExoPlayer.Builder(context).build();

219

220

// Create with custom track selector

221

DefaultTrackSelector trackSelector = new DefaultTrackSelector.Builder(context).build();

222

ExoPlayer player = new ExoPlayer.Builder(context)

223

.setTrackSelector(trackSelector)

224

.build();

225

226

// Create with custom renderers factory

227

DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(context);

228

ExoPlayer player = new ExoPlayer.Builder(context)

229

.setRenderersFactory(renderersFactory)

230

.build();

231

```

232

233

## Media Playback Control

234

235

```java

236

// Set single media item

237

MediaItem mediaItem = MediaItem.fromUri("https://example.com/video.mp4");

238

player.setMediaItem(mediaItem);

239

240

// Set multiple media items

241

List<MediaItem> mediaItems = Arrays.asList(

242

MediaItem.fromUri("https://example.com/video1.mp4"),

243

MediaItem.fromUri("https://example.com/video2.mp4")

244

);

245

player.setMediaItems(mediaItems);

246

247

// Add media items dynamically

248

player.addMediaItem(MediaItem.fromUri("https://example.com/video3.mp4"));

249

player.addMediaItem(1, MediaItem.fromUri("https://example.com/video_insert.mp4"));

250

251

// Prepare and play

252

player.prepare();

253

player.setPlayWhenReady(true);

254

```

255

256

## Renderer Information

257

258

```java

259

// Get renderer information

260

int rendererCount = player.getRendererCount();

261

for (int i = 0; i < rendererCount; i++) {

262

@C.TrackType int trackType = player.getRendererType(i);

263

Renderer renderer = player.getRenderer(i);

264

265

switch (trackType) {

266

case C.TRACK_TYPE_AUDIO:

267

// Handle audio renderer

268

break;

269

case C.TRACK_TYPE_VIDEO:

270

// Handle video renderer

271

break;

272

case C.TRACK_TYPE_TEXT:

273

// Handle text renderer

274

break;

275

case C.TRACK_TYPE_METADATA:

276

// Handle metadata renderer

277

break;

278

}

279

}

280

```

281

282

## Player Messages

283

284

```java

285

// Send message to a renderer

286

PlayerMessage message = player.createMessage(player.getRenderer(0))

287

.setType(MediaCodecRenderer.MSG_SET_VIDEO_DECODER_OUTPUT_BUFFER_RENDERER)

288

.setPayload(outputBufferRenderer)

289

.send();

290

291

// Cancel message if needed

292

message.cancel();

293

```

294

295

## Audio Session Management

296

297

```java

298

// Set audio session ID for integration with audio effects

299

player.setAudioSessionId(audioSessionId);

300

301

// Get current audio session ID

302

int currentSessionId = player.getAudioSessionId();

303

```

304

305

## Video Configuration

306

307

```java

308

// Set video effects

309

List<Effect> videoEffects = Arrays.asList(/* your effects */);

310

player.setVideoEffects(videoEffects);

311

312

// Set video scaling mode

313

player.setVideoScalingMode(C.VIDEO_SCALING_MODE_SCALE_TO_FIT);

314

315

// Set frame rate change strategy

316

player.setVideoChangeFrameRateStrategy(C.VIDEO_CHANGE_FRAME_RATE_STRATEGY_ONLY_IF_SEAMLESS);

317

```

318

319

## Seek Parameters

320

321

```java

322

// Set seek parameters for different seeking behaviors

323

player.setSeekParameters(SeekParameters.EXACT); // Exact seeking

324

player.setSeekParameters(SeekParameters.CLOSEST_SYNC); // Seek to closest sync point

325

player.setSeekParameters(SeekParameters.PREVIOUS_SYNC); // Seek to previous sync point

326

player.setSeekParameters(SeekParameters.NEXT_SYNC); // Seek to next sync point

327

328

// Custom seek parameters

329

SeekParameters customSeek = new SeekParameters(1000000, 2000000); // 1s before, 2s after tolerance

330

player.setSeekParameters(customSeek);

331

```

332

333

## Player State Management

334

335

```java

336

// Check player state

337

@Player.State int playbackState = player.getPlaybackState();

338

boolean isPlaying = player.isPlaying();

339

boolean playWhenReady = player.getPlayWhenReady();

340

341

// Control playback

342

player.setPlayWhenReady(true); // Start/resume playback

343

player.setPlayWhenReady(false); // Pause playback

344

player.stop(); // Stop playback

345

player.seekTo(30000); // Seek to 30 seconds

346

player.seekToDefaultPosition(); // Seek to default position

347

348

// Get playback position

349

long currentPosition = player.getCurrentPosition();

350

long duration = player.getDuration();

351

long bufferedPosition = player.getBufferedPosition();

352

```

353

354

## Cleanup

355

356

```java

357

// Always release the player when done

358

player.release();

359

360

// Check if player is released

361

boolean isReleased = player.isReleased();

362

```