在 Android 中播放音频时出现故障

Glitches while playing audio in Android

我正在使用 MediaPlayer 在 Android 中播放音频。 MediaPlayer 工作正常,但是当我使用随音频持续时间更新的 SeekBar 时,音频播放不流畅并且在播放时中断。以下是我的代码片段供参考。

mSongSeekBar.setMax(mMediaPlayer.getDuration());
    mSongSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            mMediaPlayer.seekTo(progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });

    new Timer().scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            mSongSeekBar.setProgress(mMediaPlayer.getCurrentPosition());
        }
    }, 0, 500);

这种行为的原因是什么?如何摆脱这个?我应该选择 Timer 吗?

您也可以考虑覆盖 onStartTrackingTouchonStopTrackingTouch 方法。因为当您拖动搜索栏时, onProgressChanged 会被频繁调用,并且每次它都试图将媒体播放器设置为从特定位置播放,因此您会遇到音频破裂或中断的情况。

我建议,在拖动搜索栏时暂时暂停媒体播放器,并在完成拖动后恢复音频。上述方法可能会帮助您实现这些行为。

我遇到了同样的问题,音频不断地自行寻找并导致故障。您需要确保仅在用户滑动时才搜索音频,而不是在正常情况下 运行。为此,onProgressChanged 的​​布尔值 fromUser 参数很有用。这将确保仅在用户擦除时才搜索音频。

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
      if(fromUser){
        mMediaPlayer.seekTo(progress);
       }
    }

原因

音频没有连续播放,每500毫秒变化一次,所以感觉很断断续续。因为 Timer() 正在改变 Progress 的值整数。并且 mMediaPlayer 每次都会自动寻找它,因为代码是这样写的:

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        mMediaPlayer.seekTo(progress);
    }

如何摆脱这个

你应该使用布尔值 fromUser 来改变音频的位置,只有当用户手动改变 seekBar 时,你可以通过一点点改变(使用 if)来做到这一点

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    if (fromUser)
    mMediaPlayer.seekTo(progress);
 }