33

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

MediaPlayer.start()/.pause()命令...我可以seekTo(1287),它会自动开始播放...

我该怎么做ExoPlayer?我试过做,seekTo(1287)但它没有开始播放...之后我也添加.setPlayWhenReady(true)了,但仍然没有运气...

我能够.stop()……但在那之后我无法让它再次开始播放,除非我.prepare()再次……但我认为我不应该在每次暂停和播放之间都这样做。

我正在使用我自己的控件和方法MediaController,这与 ExoPlayer Demo 中的不同……我不太清楚这些控件是如何实现的……

有什么建议吗?

编辑:

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

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

但我仍然遇到跟踪问题.......seekTo间歇性工作......有时它工作......但其他时候我收到这个错误:

E/AudioTrack: AudioTrack::set : Exit

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

4

2 回答 2

49

ExoPlayer源代码中的官方示例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 上报告任何问题。

于 2015-11-02T09:19:32.590 回答
11

以下是Exoplayer 2的示例代码:

player.setPlayWhenReady(true);

开始播放,(false停止)

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

为了寻求,他们使用

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

所以看来你需要prepareseekTo.

于 2018-05-29T11:40:19.237 回答