Android MediaPlayer getCurrentPosition()会导致音频卡顿

Dar*_*usL 8 audio android media-player

我正在使用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);
    }
};
Run Code Online (Sandbox Code Playgroud)

Mot*_*tov 6

我有相同的问题或类似的问题。

当我mMediapPlayer.getCurrentPosition()在TimerTask中用于更新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));
                }
            });

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

听众:

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

        }
    });
Run Code Online (Sandbox Code Playgroud)


van*_*dzi -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();
    }
Run Code Online (Sandbox Code Playgroud)

注意:mPlayer.getCurrentPosition() 不准确。报告了一些错误。我遇到的问题是当前位置高于总持续时间。