ExoPlayer和start / pause / seekTo命令

时间:2015-10-03 19:15:50

标签: android mp3 android-mediaplayer mediacontroller exoplayer

我正在尝试使用ExoPlayer,而不是MediaPlayer而我似乎无法弄明白......

MediaPlayer.start() / .pause()个命令...我只能seekTo(1287)并自动开始播放......

如何使用ExoPlayer执行此操作?我曾试图做seekTo(1287)但是它没有开始播放......之后我还添加了.setPlayWhenReady(true),但仍然没有运气......

我能够.stop() ......但除非我再次.prepare(),否则我无法让它再次开始播放......但我认为我不应该这样做在每次停顿和比赛之间。

我正在使用我自己的控件和方法,与ExoPlayer演示中的MediaController相反......我无法看到控件是如何实现的......

有人建议吗?

修改

好的,我想出了暂停并开始......

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

但是我仍然遇到跟踪问题...... .seekTo间歇性地工作......有时它会起作用......但有时我会收到此错误:

E/AudioTrack: AudioTrack::set : Exit

(它只进入缓冲状态......并没有完全达到“准备好”......

2 个答案:

答案 0 :(得分:44)

ExoPlayer 源代码中的official example of the PlayerControl完全符合您的要求:

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的base implementation,最后在Github上报告任何issue

答案 1 :(得分:3)

以下是the example code对Exoplayer 2的处理方式:

POST

starts playback, (false stops)

  

如果播放器已处于就绪状态,则此方法可用于暂停和恢复播放。

要寻求,他们使用

player.setPlayWhenReady(true);

所以看来你需要在boolean haveStartPosition = startWindow != C.INDEX_UNSET; if (haveStartPosition) { player.seekTo(startWindow, startPosition); } player.prepare(mediaSource, !haveStartPosition, false); 之后prepare