web-dev-qa-db-ja.com

ExoPlayerおよびstart / pause / seekToコマンド

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

(そして、それはバッファ状態になります...まったく「準備完了」になりません...

31
DeNitE Appz

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で issue を報告することをお勧めします。

44
bonnyz

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 が必要なようです。

5
serv-inc