9

オーディオ ファイルの進行状況を表示し、特定の時間までシークするために SeekBar を使用しています。更新には、MediaPlayer で毎秒ほど getCurrentPosition() を呼び出す Runnable を使用します。これが発生するたびに、オーディオにわずかな遅延が発生します。私は頻繁に呼び出すので、何かを再生しているときにカクつきが非常に目立ちます。関連する場合は、 setAudioStreamType(AudioManager.STREAM_MUSIC) を使用しており、ファイル形式は AAC オーディオ (ビデオなし) の mp4 で、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);
    }
};
4

3 に答える 3

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

                    }
                });
于 2012-10-01T06:13:58.167 に答える
-2

このメソッドを使用して進行状況を計算します」

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 よりも高いという問題がありました。

于 2012-10-01T06:24:50.220 に答える