安卓MediaPlayer getCurrentPosition()导致音频卡顿

9
我正在使用SeekBar来显示音频文件的进度并寻找确定的时间。为了更新,我使用一个Runnable,在大约每秒钟调用一次MediaPlayer的getCurrentPosition()方法。每次调用时,都会有一点音频延迟。由于我经常调用它,所以在播放时会出现非常明显的卡顿。如果相关的话,我正在使用setAudioStreamType(AudioManager.STREAM_MUSIC),文件格式是mp4带有AAC音频(没有视频),我正在使用Android 2.3.4。是否有办法与getCurrentPosition()获得良好的音频效果,或者我必须实现自己的进度计算?
该Runnable:
private Runnable mUpdateTask = new Runnable(){

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

我已经为VideoView完成了这个,你可以在这里查看。 - Lalit Poptani
3个回答

6
我遇到了相似的问题。在TimerTask中使用mMediaPlayer.getCurrentPosition()更新SeekBar时,我听到了声音问题,比如回音,但实际上问题并不存在。
问题在于我还使用了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) {

        }
    });

我的问题也是一样的.. 它让我疯了。谢谢。 - Ramon

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

                    }
                });

-3

我使用这种方法来计算进度'

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()不是很准确。有一些错误已经被报告了。我遇到的问题是当前位置比总时长还要高。


我已经实现了类似的东西,但稍微复杂一些,因为我有暂停和寻找功能。 - DariusL
请问可以告诉我需要传递什么参数到这个方法吗?比如说,如何获取当前持续时间(currentDuration)? - Arti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接