5

基本的にタイマーを設定し、2 つのサウンドのセットを次々と再生する小さなアプリがあります。

毎回まったく同時に両方のサウンドを開始したかったので、2 つのタイマーを試しました。開始前に両方のタイマーを設定するために、アプリに500ミリ秒を与えました

    Calendar cal = Calendar.getInstance();
    Date start = new Date(cal.getTime().getTime() + 500);

    timerTask1 = new TimerTask() { //1st timer
      @Override
      public void run() {
          soundManager.playSound(1);
      }
    };
    timer1 = new Timer();
    timer1.schedule(timerTask1, start, 550);


    timerTask2 = new TimerTask() { //2nd timer
      @Override
      public void run() {
          soundManager.playSound(2);
      }
    };
    timer2 = new Timer();
    timer2.schedule(timerTask2, start, 550);
}

soundManager は、このチュートリアルに基づくSoundManagerオブジェクトです。私が行った唯一の変更は、同時に 2 つのサウンドしか再生しないため、使用可能なストリームの数を 20 から 2 に減らしたことです。

今問題。Motorola RAZR でもエミュレーターでも同じ速度で再生されません。アプリが時々遅くなり、ブレーキが必要以上に長くなります。私はそれを起こさせることはできません。ここで何が問題なのですか?

OGG形式の非常に短いサウンドを使用しています

編集:私はいくつかの調査を行いました。2つのアプローチを使用しました。音が発射されるまでのミリ秒の距離を測定していました。リフレッシュ レートは 500 ミリ秒でした。

  • 最初のアプローチは TimerTask でした。これは大きな失敗です。それは 300 ミリ秒で開始し、その後絶えず増加し、しばらくすると (2 分) 497 ミリ秒で安定しました。
  • 2番目のアプローチは、AsyncTaskのwhileループでした-475から500ミリ秒の出力が得られましたが、これはTimerTaskよりも優れていますが、それでも不正確です

結局、どのアプローチもスムーズにプレイできませんでした。いつもラグがあった

4

2 に答える 2

5

少し多すぎるかもしれませんが、SoundPool の別の実装を試すことができます。

public class Sound {
    SoundPool soundPool;
    int soundID;

    public Sound(SoundPool soundPool, int soundID) {
        this.soundPool = soundPool;
        this.soundID = soundID;
    }

    public void play(float volume) {
        soundPool.play(soundID, volume, volume, 0, 0, 1);
    }

    public void dispose() {
        soundPool.unload(soundID);
    }
}

それを使用するには、次のようなことができます。

SoundPool soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
AssetFileDescriptor assetFileDescriptor = activity.getAssets().openFd(fileName);
int soundID = soundPool.load(assetFileDescriptor, 0);

Sound sound = new Sound(soundPool, soundID);

そして、プレイします:

sound.play(volume);

PS このコードでも問題が解決しない場合は、コメントを投稿してください。折り返しご連絡いたします。

于 2012-08-26T12:17:04.040 に答える
1

SoundPoolを使用していますか?MediaPlayerよりも高速です。2つのサウンドをまとめる可能性が最も高いのは、同じスレッドでそれらを再生する場合です。

于 2012-08-24T10:39:18.787 に答える