ExoPlayer et les commandes start / pause / seekTo
je suis en train d'utiliser ExoPlayer
plutôt pour MediaPlayer
et je n'arrive pas à le comprendre...
MediaPlayer
a .start()
/.pause()
commandes... et je peux juste seekTo(1287)
et il démarre automatiquement la lecture...
Comment faire avec ExoPlayer
? J'ai essayé de faire seekTo(1287)
mais il ne commence pas à jouer après... J'ai également ajouté .setPlayWhenReady(true)
après, et toujours pas de chance...
je suis en mesure de .stop()
... mais je ne peux pas le faire pour commencer à jouer de nouveau après sauf que je .prepare()
nouveau... mais je ne pense pas que je devrais avoir à faire ça entre chaque pause et jouer.
j'utilise mes propres contrôles et méthodes par opposition à MediaController
comme dans la démo D'ExoPlayer... Je ne vois pas comment les contrôles sont mis en œuvre...
avez-vous des suggestions?
Edit:
OK, j'ai trouvé une pause et je commence...
.setPlayWhenReady(true) // start
.setPlayWhenReady(false) // pause
mais j'ai encore des problèmes avec le tracking... .seekTo
fonctionne de façon intermittente... parfois, cela fonctionne... mais d'autres fois, j'obtiens cette erreur:
E/AudioTrack: AudioTrack::set : Exit
(et il ne reçoit que de l'état de la mémoire tampon... n'est pas tout à fait obtenir à l'état "prêt"...
2 réponses
exemple officiel du PlayerControl
dans le ExoPlayer code source faites 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 prendre un coup d'oeil à l' implémentation de base De L'ExoPlayer et, éventuellement, signaler tout problème sur Github.
Voici comment le code d'exemple est-il pour Exoplayer 2:
player.setPlayWhenReady(true);
commence la lecture, (false
arrête)
si le lecteur est déjà prêt, cette méthode peut être utilisée pour faire une pause et reprendre la lecture.
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
.