3

MediaPlayerのgetDuration()メソッドは、いくつかのオーディオファイルに対して誤った値を与えています。これらすべてのファイルに共通する特徴は、Audacityまたはその他のオーディオ編集ツールを使用して操作されたことです。これは、MediaPlayerの進行状況をプログレスバーに結び付けようとするときに問題になります。

私は先に進んでそれを記録しました:

while(mPlayer.isPlaying())
    Log.i("progress/total", 
            mPlayer.getCurrentPosition() + 
            "/" + mPlayer.getDuration());

そしてこれを見つけました:

I/progress/total(643): 14615/14620
I/progress/total(643): 14647/14620

これは数千のログラインの2つだけですが、ポイントは、進行状況がgetDuration()が曲の合計継続時間であると信じているものを通過した後、そのまま継続することです。MediaPlayerは実際に継続時間の正しい合計を与えることができるので、これを使用してProgressBarの適切な最大値を取得する方法はありますか?

4

3 に答える 3

0

少し前にデモ プレーヤーを再生しようとしていましたが、Android エミュレーターでテストしたとき、その動作は質問で述べたのと同じでしたが、実際のデバイスで試したところ、メディアの長さの正確な値が得られました。

あなたの意図がシークバーと同期してメディアを再生することだけであれば、以下のようなことができます。

if (!mediaPlayer.isPlaying())
mediaPlayer.start();

handler.post(new SeekbarRefresh(seekbar));

//Class to update progress of seekbar according to music player 
private class SeekbarRefresh implements Runnable {
    SeekBar seekBar;

    public SeekbarRefresh(SeekBar seekBar, ImageView imageView) {
        this.seekBar = seekBar;
    }

    @Override
    public void run() {

        if (mediaPlayer != null) {
            if (mediaPlayer.getDuration() > 0) {
                int currentDuration = mediaPlayer.getCurrentPosition();
                seekBar.setProgress(currentDuration);
                if (mediaPlayer.isPlaying()){
                    handler.post(this);
                    isAudioPlaying = true;
                     }
                else {
                    handler.removeCallbacks(this);
                    isAudioPlaying = false;
                }
            }
        }
    }
}

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

            mediaPlayer.seekTo(progress);
        }
    });
于 2014-08-05T06:00:33.823 に答える