web-dev-qa-db-fra.com

ExoPlayer et commandes de démarrage / pause / recherche

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

31
DeNitE Appz

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.

44
bonnyz

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.

5
serv-inc