我正在尝试使用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
(它只进入缓冲状态......并没有完全达到“准备好”......
答案 0 :(得分:44)
ExoPlayer 源代码中的official example of the 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的base implementation,最后在Github上报告任何issue。
答案 1 :(得分:3)
以下是the example code对Exoplayer 2的处理方式:
POST
starts playback, (false
stops)
如果播放器已处于就绪状态,则此方法可用于暂停和恢复播放。
要寻求,他们使用
player.setPlayWhenReady(true);
所以看来你需要在boolean haveStartPosition = startWindow != C.INDEX_UNSET;
if (haveStartPosition) {
player.seekTo(startWindow, startPosition);
}
player.prepare(mediaSource, !haveStartPosition, false);
之后prepare
。