gpt4 book ai didi

Android MediaPlayer getCurrentPosition() 导致音频卡顿

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:53:23 33 4
gpt4 key购买 nike

我正在使用一个 SeekBar 来显示音频文件的进度和搜索到某个时间。为了更新,我使用了一个 Runnable,它每隔一秒左右在 MediaPlayer 上调用 getCurrentPosition() 。每次发生这种情况时,音频都会有少量滞后。因为我经常调用它,所以我在玩东西时会出现非常明显的口吃。如果它是相关的,我正在使用 setAudioStreamType(AudioManager.STREAM_MUSIC) 并且文件格式是 mp4 whith AAC 音频(无视频)并且我正在使用 Android 2.3.4。有没有一种方法可以使用 getCurrentPosition() 获得良好的音频,或者我是否必须实现自己的进度计算?

可运行的:

private Runnable mUpdateTask = new Runnable(){

@Override
public void run() {
mSeekBar.setProgress((int) (mPlayer.getCurrentPosition() * 100 / mArrayAdapter.getRecording(mPlayingId).mDuration));
mHandler.postDelayed(mUpdateTask, 999);
}
};

最佳答案

我遇到了同样的问题或类似的问题。

当我在 TimerTask 中使用 mMediapPlayer.getCurrentPosition() 来更新 SeekBar 时,我听到了类似回声的声音问题,但实际上问题并不存在。

问题是我还使用了 SeekBar OnSeekBarChangeListener 进行手动搜索,但是发生的事情是从 TimerTask 更新 seekBar 也触发了监听器,它执行了 mp.seekTo(progress ) 和这个,导致 mp 再次返回到那个位置..

我已经按照此处的建议使用 fromUser 参数修复了它,仅当 seekBar 手动更改时才进行搜索。

这是我的示例代码:

定时器任务:

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) {

}
});

关于Android MediaPlayer getCurrentPosition() 导致音频卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12651737/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com