在Android中播放音频时出现毛刺

时间:2020-05-20 05:53:32

标签: java android android-mediaplayer

我正在使用 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);

此行为的原因是什么?如何摆脱这个?我应该使用计时器的其他替代方法吗?

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,即音频自身不断寻找并引起毛刺。您需要确保仅在用户清理音频时才搜索音频,而不是在正常运行时才搜索音频。为此,onProgressChanged的布尔fromUser参数很有用。这样可以确保仅在用户清理音频时进行音频搜索。

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

答案 1 :(得分:1)

原因

音频不是连续播放,而是每500毫秒变化一次,因此感觉很破损。因为 Timer() 正在更改 Progress 整数的值。随着代码的编写, mMediaPlayer 每次都会自动寻找它:

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

如何摆脱这种情况

仅当用户手动更改seekBar时,才应使用boolean fromUser更改音频的位置,只需稍作更改即可完成此操作(使用if)

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

答案 2 :(得分:0)

您可能还会考虑覆盖onStartTrackingTouchonStopTrackingTouch方法。因为当您拖动搜索栏时,onProgressChanged会被频繁调用,并且每次它试图将媒体播放器设置为从特定位置播放时,都会导致音频破裂或破裂。

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

相关问题