ExoPlayer和开始/暂停/跳转命令

35

我正在尝试使用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个回答

49

ExoPlayer源代码中的{{code: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的基本实现,并在Github上报告任何问题

5
Github链接已失效。 - JoachimR
1
ExoPlayer在v2中发生了很多变化。找不到PlayerControl.java的更新GH链接,但这是基本实现的链接:https://github.com/google/ExoPlayer/blob/release-v2/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java - Jose_GD
4
ExoPlayer.UNKNOWN_TIME 翻译为 com.google.android.exoplayer2.C.TIME_UNSET。请注意,翻译并不改变原文的含义,只是将其转换为中文。 - shiami
链接已失效,请修复。 - Ranjithkumar
如何将这个类添加到我的XOPlayer对象中? - Afinas EM

11

以下是Exoplayer 2的示例代码实现:

player.setPlayWhenReady(true);

开始播放,(false为停止)

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

要进行搜索,他们使用

boolean haveStartPosition = startWindow != C.INDEX_UNSET;
if (haveStartPosition) {
  player.seekTo(startWindow, startPosition);
}
player.prepare(mediaSource, !haveStartPosition, false);

看起来你需要在seekTo之后准备


1
这是根据最新的ExoPlayer发布版本的最新答案。 - Jishant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接