Reputation: 3541
I'm using Exoplayer in my android app to play video and audio files. according to Exoplayer developer's guide,in order to loop a video/audio, this is what you have to do
MediaSource mediaSource = new ExtractorMediaSource(videoUri, ...);
// Loops the video indefinitely.
LoopingMediaSource loopingSource = new LoopingMediaSource(mediaSource);
So I implemented it like this in my Activity's onCreate method
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(factory);
simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
simpleExoPlayer.setPlayWhenReady(true);
simpleExoPlayerView.setPlayer(simpleExoPlayer);
// Measures bandwidth during playback. Can be null if not required.
bandwidthMeter2 = new DefaultBandwidthMeter();
// Produces DataSource instances through which media data is loaded.
dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, applicationName), bandwidthMeter2);
// Produces Extractor instances for parsing the media data.
extractorsFactory = new DefaultExtractorsFactory();
mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory, extractorsFactory, null, null);
loopingSource = new LoopingMediaSource(mediaSource);
simpleExoPlayer.prepare(mediaSource);
But looping of my video file is not taking place. it just plays once.
Upvotes: 13
Views: 18688
Reputation: 2863
just use player.setRepeatMode(player.REPEAT_MODE_ONE);
Upvotes: 34
Reputation: 7806
If you as I need to handle the Ended event, it is possible to do it like this:
player.addListener(object : Player.Listener {
override fun onPlaybackStateChanged(playbackState: Int) {
if (playbackState == Player.STATE_ENDED) {
...
player.seekTo(0)
player.play()
}
}
})
Upvotes: 0
Reputation: 810
You can simply set repeat mode as "Repeat_MODE_ONE".
Example for Kotlin:
val player: SimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(
context,
DefaultRenderersFactory(context),
DefaultTrackSelector(),
DefaultLoadControl()
).apply {
repeatMode = Player.REPEAT_MODE_ONE
}
p.s.The player is from com.google.android.exoplayer2
Upvotes: 9
Reputation: 21
the only solution that worked for me was this:
simpleExoPlayer.prepare(mediaSource);
simpleExoPlayer.setPlayWhenReady(true);
simpleExoPlayer.seekTo(0);
exoPlayer.requestFocus();
simpleExoPlayer.addListener(new Player.EventListener() {
@Override
public void onLoadingChanged(boolean isLoading) {
}
@Override
public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
switch (playbackState) {
case Player.STATE_READY:
prog.setVisibility(View.GONE);
simpleExoPlayer.setPlayWhenReady(true);
break;
case Player.STATE_BUFFERING:
prog.setVisibility(View.VISIBLE);
simpleExoPlayer.seekTo(0);
break;
case Player.STATE_IDLE:
simpleExoPlayer.retry();
break;
}
}
});
}
Upvotes: 0
Reputation: 1489
player = ExoPlayerFactory.newSimpleInstance(this);
The above line of code instantiates the ExoPlayer with the default track selector. We can avoid creating bandwidth meter, track selector if we are not customising the track selector.
Looping can be achieved using LoopingMediaSource. We have to pass the loop count in the LoopingMediaSouce constructor. If we want to loop the media indefinitely, it is better to use setRepeatMode()
method of the player.
new LoopingMediaSource(mediaSource, 3)
Attaching a sample for reference.
<code>
private MediaSource getLoopingMediaSource() {
DefaultDataSourceFactory dataSourceFactory = new DefaultDataSourceFactory(ExoPlayerActivity.this, Util.getUserAgent(ExoPlayerActivity.this, "application-name"));
MediaSource mediaSource = new ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Samples.MP4_URI);
LoopingMediaSource loopingMediaSource = new LoopingMediaSource(mediaSource, 3);
return loopingMediaSource;
}
player = ExoPlayerFactory.newSimpleInstance(this);
playerView.setPlayer(player);
player.prepare(getLoopingMediaSource());
player.setPlayWhenReady(true);
</code>
Upvotes: 3
Reputation: 3541
I discovered that there was some crucial info left out in Exoplayer developers guide. after creating LoopingMediaSource
instance, one should not call simpleExoPlayer.prepare(mediaSource);
but instead call simpleExoPlayer.prepare(loopingSource);
. below is the complete code
BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
TrackSelection.Factory factory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
TrackSelector trackSelector = new DefaultTrackSelector(factory);
simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(this,trackSelector);
simpleExoPlayer.setPlayWhenReady(true);
simpleExoPlayerView.setPlayer(simpleExoPlayer);
// Measures bandwidth during playback. Can be null if not required.
bandwidthMeter2 = new DefaultBandwidthMeter();
// Produces DataSource instances through which media data is loaded.
dataSourceFactory = new DefaultDataSourceFactory(this,
Util.getUserAgent(this, applicationName), bandwidthMeter2);
// Produces Extractor instances for parsing the media data.
extractorsFactory = new DefaultExtractorsFactory();
MediaSource mediaSource = new ExtractorMediaSource(videoUri,dataSourceFactory, extractorsFactory, null, null);
// Loops the video indefinitely.
LoopingMediaSource loopingSource = new LoopingMediaSource(mediaSource);
simpleExoPlayer.prepare(loopingSource);
Upvotes: 14