我正在使用SeekBar来显示音频文件的进度以及寻找某个时间。为了更新,我使用Runnable,每隔一秒左右在MediaPlayer上调用getCurrentPosition()。每次发生这种情况都会导致音频中出现少量延迟。因为我经常打电话,所以在玩东西时我会发现非常明显的口吃。如果它是相关的,我正在使用setAudioStreamType(AudioManager.STREAM_MUSIC),文件格式是mp4,而AAC音频(没有视频),我正在使用Android 2.3.4。有没有办法通过getCurrentPosition()获得良好的音频,还是我必须实现自己的进度计算?
The Runnable:
private Runnable mUpdateTask = new Runnable(){
@Override
public void run() {
mSeekBar.setProgress((int) (mPlayer.getCurrentPosition() * 100 / mArrayAdapter.getRecording(mPlayingId).mDuration));
mHandler.postDelayed(mUpdateTask, 999);
}
};
答案 0 :(得分:5)
我有同样的问题或类似的东西。
当我在TimerTask中使用mMediapPlayer.getCurrentPosition()
来更新SeekBar时,我听到了声音问题,比如echo,但实际上问题不在那里..
问题是我还使用SeekBar OnSeekBarChangeListener
进行手动搜索,但发生的事情是从TimerTask更新seekBar也触发了监听器,它执行了mp.seekTo(progress)
这导致了mp再次回到那个位置..
我已经使用此处建议的fromUser
参数修复了它,只有在seekBar手动更改时才进行搜索。
以下是我的示例代码:
TimerTask:
public void initializeTimerTask() {
mTimerTask = new TimerTask() {
public void run() {
int progress = mp.getCurrentPosition()/1000;
runOnUiThread(new Runnable() {
@Override
public void run() {
mSeekBar.setProgress(progress);
tvDuration.setText(DateUtils.formatElapsedTime(progress));
}
});
}
};
}
监听器:
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(mp != null && fromUser){
mp.seekTo(progress * 1000);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
答案 1 :(得分:2)
你可以这样做:
private Runnable mUpdateTask = new Runnable(){
@Override
public void run()
{
mSeekBar.setProgress(mMediapPlayer.getCurrentPosition());
mHandler.postDelayed(mUpdateTask, 999);
}
};
您还可以按照以下方式应用搜索栏进度更改监听器:
mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
@Override
public void onStopTrackingTouch(SeekBar seekBar)
{
}
@Override
public void onStartTrackingTouch(SeekBar seekBar)
{
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser)
{
if (fromUser)
{
int secProgress = seekBar.getSecondaryProgress();
if (secProgress> progress)
{
mMediapPlayer.seekTo(progress);
}
else
{
seekBar.setProgress(mSeekBar.getProgress());
}
}
}
});
mMediapPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener()
{
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent)
{
mSeekBar.setSecondaryProgress((mSeekBar.getMax()/100)*percent);
}
});
答案 2 :(得分:-1)
我使用这种方法来计算进度'
public static int getProgressPercentage(long currentDuration,
long totalDuration) {
Double percentage = (double) 0;
long currentSeconds = (int) (currentDuration / 1000);
long totalSeconds = (int) (totalDuration / 1000);
// calculating percentage
percentage = (((double) currentSeconds) / totalSeconds) * 100;
// return percentage
return percentage.intValue();
}
注意:mPlayer.getCurrentPosition()不准确。报告了一些错误。我有一个问题,即当前位置高于totalDuration。