2

一種のマルチトラック プログラムのように、いくつかのサウンドを一緒に再生する音楽アプリケーションを開発しています。すべてのサウンドが再生される瞬間になると、タイマーがトリガーされます。サウンドはビートに合わせて正確に再生され、完全に同期およびミックスされなければなりません。

私が見つけた最も簡単な解決策は、サウンドごとに 1 つの MediaPlayer を用意し、最初にすべてを初期化し、アプリの OnCreate() 内で MediaPlayer.create() を使用することです。信頼性と速度を向上させるために、サウンドごとに 2 つのメディアプレーヤーを作成しました。次に、次のような単純なループを呼び出すタイマーがあります。

for (int w=0; w<SOUNDS; w++)
    if (must_play(w)) {
        if (mp[w].isPlaying()) {
            if (mp2[w].isPlaying())
                mp[w].seekTo(0);
            else mp2[w].start();
        } else mp[w].start();
    }

.seekTo(0) を使用したのは、.stop() および .start() を作成するよりもわずかに高速であることがわかったためです。しかし、音は常に完全に同期しているわけではありません。2 つのメディアプレーヤーの .start() 間の 1/10 秒の遅延は、これら 2 つのサウンドが完全に並んで再生される 2 つのドラムである場合、非常に厄介です。.start() に指示されたすべてのメディアプレーヤーを一度に効果的に再生するように強制する方法はありますか? ドラム サウンドのように、サウンドが非常に短い場合があることに注意してください。問題は、複数のメディア プレーヤーを時間の経過とともに同期させ続けることではなく、遅延なくすべてを正確に開始させることです。

私の意見では、次の 2 つの問題が関係しているため、この質問はかなりトリッキーです。

  • タイマーやアプリ自体の速度を低下させる可能性がある他のプロセスよりも優先されます。
  • すべてのサウンドをアトミ​​ックに実行する単一のコマンド/オブジェクト/メソッド (または何でも) を作成する方法。

ありがとうございました。

4

1 に答える 1

0

MediaPlayerの代わりにSoundPoolクラスを使用して作成しました。応答性がはるかに高く、マルチトラックを非常にうまく処理し、ストリームが十分でない場合は再生される最も古いサウンドをカットします。質問には答えられませんでしたが、問題は修正されました。

于 2012-12-06T15:14:51.960 に答える