我正在使用 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);
此行为的原因是什么?如何摆脱这个?我应该使用计时器的其他替代方法吗?
答案 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)
您可能还会考虑覆盖onStartTrackingTouch
和onStopTrackingTouch
方法。因为当您拖动搜索栏时,onProgressChanged
会被频繁调用,并且每次它试图将媒体播放器设置为从特定位置播放时,都会导致音频破裂或破裂。
我建议在拖动搜索栏时暂时暂停媒体播放器,并在完成拖动后恢复音频。上面提到的方法可能会帮助您实现这些行为。