J'essaie d'utiliser ExoPlayer
, par opposition à MediaPlayer
et je n'arrive pas à le comprendre ...
MediaPlayer
a .start()
/.pause()
commandes ... et je peux juste seekTo(1287)
et il commence automatiquement à jouer ...
Comment faire cela avec ExoPlayer
? J'ai essayé de faire seekTo(1287)
mais ça ne commence pas à jouer après ... J'ai aussi ajouté .setPlayWhenReady(true)
après ça, et toujours pas de chance ...
Je suis capable de .stop()
... mais je ne peux pas le faire recommencer à jouer à moins que je .prepare()
à nouveau ... mais je ne pense pas que je devrais faites cela entre chaque pause et lecture.
J'utilise mes propres contrôles et méthodes contrairement à MediaController
comme dans la démo ExoPlayer ... Je ne vois pas très bien comment les contrôles sont implémentés ...
Des suggestions quelqu'un?
Modifier:
OK, j'ai compris une pause et commencer ...
.setPlayWhenReady(true) // start
.setPlayWhenReady(false) // pause
Mais j'ai toujours des problèmes avec le suivi ... .seekTo
fonctionne par intermittence ... parfois cela fonctionne ... mais d'autres fois j'obtiens cette erreur:
E/AudioTrack: AudioTrack::set : Exit
(et il n'atteint que l'état tampon ... ne se rend pas tout à fait "prêt" ...
Le exemple officiel du PlayerControl
dans le code source ExoPlayer fait exactement ce que vous avez demandé:
public class PlayerControl implements MediaPlayerControl { private final ExoPlayer exoPlayer; public PlayerControl(ExoPlayer exoPlayer) { this.exoPlayer = exoPlayer; } @Override public boolean canPause() { return true; } @Override public boolean canSeekBackward() { return true; } @Override public boolean canSeekForward() { return true; } @Override public int getAudioSessionId() { throw new UnsupportedOperationException(); } @Override public int getBufferPercentage() { return exoPlayer.getBufferedPercentage(); } @Override public int getCurrentPosition() { return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 : (int) exoPlayer.getCurrentPosition(); } @Override public int getDuration() { return exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 : (int) exoPlayer.getDuration(); } @Override public boolean isPlaying() { return exoPlayer.getPlayWhenReady(); } @Override public void start() { exoPlayer.setPlayWhenReady(true); } @Override public void pause() { exoPlayer.setPlayWhenReady(false); } @Override public void seekTo(int timeMillis) { long seekPosition = exoPlayer.getDuration() == ExoPlayer.UNKNOWN_TIME ? 0 : Math.min(Math.max(0, timeMillis), getDuration()); exoPlayer.seekTo(seekPosition); } }
Si vous rencontrez des comportements étranges pendant l'opération de recherche, cela peut être dû à votre type de flux/fichier particulier. Je peux vous suggérer de jeter un oeil à la implémentation de base de l'ExoPlayer et, éventuellement, de signaler tout problème sur Github.
Voici comment l'exemple de code le fait pour Exoplayer 2:
player.setPlayWhenReady(true);
démarre la lecture, (false
s'arrête)
Si le lecteur est déjà prêt, cette méthode peut être utilisée pour interrompre et reprendre la lecture.
Pour chercher, ils utilisent
boolean haveStartPosition = startWindow != C.INDEX_UNSET; if (haveStartPosition) { player.seekTo(startWindow, startPosition); } player.prepare(mediaSource, !haveStartPosition, false);
Il semble donc que vous devez prepare
après le seekTo
.