33

ExoPlayerとは対照的に、私は使用しようとしていますが、MediaPlayerそれを理解できないようです...

MediaPlayer.start()/コマンドが.pause()あります...そして、私はただseekTo(1287)、それは自動的に再生を開始します...

でこれを行うにはどうすればよいExoPlayerですか? 私はやろうとしましseekTo(1287)たが、その後再生を開始しません...その後も追加しまし.setPlayWhenReady(true)たが、まだ運がありません...

でき.stop()ます...しかし、もう一度再生しない限り、その後再生を再開することはできません.prepare()...しかし、一時停止と再生のたびにそれを行う必要はないと思います。

ExoPlayer Demoとは対照的に、独自のコントロールとメソッドを使用していますMediaController...コントロールがどのように実装されているかよくわかりません...

何か提案はありますか?

編集:

OK、一時停止して開始することを理解しました...

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

prepareしたがって、の後にする必要があるようですseekTo

于 2018-05-29T11:40:19.237 に答える