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"...

29
demandé sur serv-inc 2015-10-03 22:15:50

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.

42
répondu bonnyz 2015-11-02 09:19:32

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.

2
répondu serv-inc 2018-05-29 11:40:19