Подтвердить что ты не робот

Команды ExoPlayer и start/pause/seekTo

Я пытаюсь использовать ExoPlayer против MediaPlayer, и я не могу понять это...

MediaPlayer имеет команды .start()/.pause()... и я могу просто seekTo(1287), и он автоматически начинает воспроизведение...

Как мне это сделать с помощью ExoPlayer? Я пытался сделать seekTo(1287), но после этого он не запускается... После этого я добавил .setPlayWhenReady(true) и до сих пор не повезло...

Я могу .stop()... но я не могу заставить его снова начать играть, если я снова не вернусь .prepare()... но я не думаю, что мне нужно будет делать это между каждой паузой и играть.

Я использую свои собственные элементы управления и методы, противоположные MediaController, как в демонстрации ExoPlayer... Я не могу понять, как реализованы элементы управления...

Любые предложения кто-нибудь?

Edit:

ОК, я понял паузу и начал...

.setPlayWhenReady(true) // start
.setPlayWhenReady(false) // pause

Но у меня все еще возникают проблемы с отслеживанием... .seekTo работает с перерывами... иногда это работает... но в других случаях я получаю эту ошибку:

E/AudioTrack: AudioTrack::set : Exit

(и он попадает только в состояние буфера... не совсем подходит к "готовому"...

4b9b3361

Ответ 1

Официальный пример PlayerControl в исходном коде ExoPlayer делает именно то, что вы просили:

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);
  }

}

Если вы испытываете странное поведение во время операции поиска, это может быть связано с вашим конкретным типом потока/файла. Я могу предложить вам взглянуть на базовую реализацию ExoPlayer и, в конце концов, сообщить любой issue на Github.