【问题标题】:ExoPlayer and start / pause / seekTo commandsExoPlayer 和 start/pause/seekTo 命令
【发布时间】:2015-12-31 19:17:51
【问题描述】:

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

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

如何使用ExoPlayer 执行此操作?我已经尝试过seekTo(1287),但它没有开始播放......之后我还添加了.setPlayWhenReady(true),但仍然没有运气......

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

我正在使用我自己的控件和方法来反对 MediaController 就像在 ExoPlayer 演示中一样...我不太清楚这些控件是如何实现的...

大家有什么建议吗?

编辑:

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

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

但我的跟踪仍然存在问题....seekTo 间歇性工作...有时它有效...但其他时候我收到此错误:

E/AudioTrack: AudioTrack::set : Exit

(它只会进入缓冲状态……还没有完全“准备好”……

【问题讨论】:

    标签: android mp3 android-mediaplayer mediacontroller exoplayer


    【解决方案1】:

    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

    【讨论】:

    • github 链接失效
    • ExoPlayer 在 v2.0 中发生了很大变化。找不到 PlayerControl.java 的更新 GH 链接,但这里是基本实现的链接:github.com/google/ExoPlayer/blob/release-v2/library/src/main/…
    • ExoPlayer.UNKNOWN_TIME -> com.google.android.exoplayer2.C.TIME_UNSET
    • 链接已失效..请修复此问题。
    • 如何将这个类添加到我的 xoplayer 对象中?
    【解决方案2】:

    the example code 是如何为 Exoplayer 2 做的:

    player.setPlayWhenReady(true);
    

    starts playback, (false stops)

    如果播放器已经处于就绪状态,那么这个方法可以用来暂停和恢复播放。

    为了寻找,他们使用

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

    所以看来你需要在seekTo之后prepare

    【讨论】:

    • 这是根据最新的 exoplayer 发布的最新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多