在 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 吗?
您也可以考虑覆盖 onStartTrackingTouch
和 onStopTrackingTouch
方法。因为当您拖动搜索栏时, 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);
}
我正在使用 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 吗?
您也可以考虑覆盖 onStartTrackingTouch
和 onStopTrackingTouch
方法。因为当您拖动搜索栏时, 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);
}