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
(そして、それはバッファ状態になります...まったく「準備完了」になりません...
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 を報告することをお勧めします。
Exoplayer 2で サンプルコード を実行する方法は次のとおりです。
player.setPlayWhenReady(true);
プレーヤーが既に準備完了状態にある場合、このメソッドを使用して再生を一時停止および再開できます。
求めるために、彼らは使用します
boolean haveStartPosition = startWindow != C.INDEX_UNSET; if (haveStartPosition) { player.seekTo(startWindow, startPosition); } player.prepare(mediaSource, !haveStartPosition, false);
したがって、prepare
の後に seekTo
が必要なようです。