7

Android で 2 つのサウンドを同時に再生しようとしています。2 つの MediaPlayer を作成し、以下のコードを使用しています。

private void playSound(){
       if (mp1 != null) {
           mp1.release(); 
        }
       if (mp2 != null) {
            mp2.release(); 
         }


        mp1 = MediaPlayer.create(this, soundArray[0]); 
        mp2 = MediaPlayer.create(this, soundArray[3]);
        mp1.start();
        mp2.start();

      }

ありがとう

4

5 に答える 5

5

2 つのデジタル サウンドを同時に再生することは、(現実世界のように) それらを合計するのと同じくらい簡単です。

これにより振幅が上昇する可能性があるため、クリッピング アーティファクトを発生させたくない場合は、配列タイプの数値境界を超えないように注意する必要があります。

こちらの質問と回答も参考になるかもしれません

于 2010-12-03T23:23:32.193 に答える
2

2 つのことを同時に行うのは難しい.. 1 つのスレッド環境では、OS はスレッド間をジャンプして、同時に実行されているスレッドをシミュレートする必要があります。したがって、それらを「同時に」実行できるようにするには、2 つのスレッドを開始し、それらが同期されるべきポイントに到達するのを待ってから、両方のスレッドが続行されるようにする必要があります。

もう 1 つの解決策は、2 つのサウンド ストリームをマージして、実際には 1 つのサウンドが再生されているときに 2 つのサウンドが再生されているように聞こえるようにすることです。私は音の操作が得意ではありませんが、Android ではありません...

最初の解決策は、2 つのスレッドを生成し、両方を開始してから、 and を使用してwait()、おそらくLockクラスを使用して同時にnotify()呼び出すことです。MediaPlayer.start()


さて、2 つのスレッドを同期する方法の長い例 (ここの例に基づくと:

import java.util.concurrent.locks.*;

class SynchronizeTest implements Runnable {
    public static void main(String[] args) {
        final ReentrantLock lock = new ReentrantLock();
        final Condition cond = lock.newCondition(); 

        new Thread(new SynchronizeTest(1, lock, cond)).start();
        new Thread(new SynchronizeTest(2, lock, cond)).start();
    }

    private final int number;
    private final ReentrantLock lock;
    private final Condition cond;

    public SynchronizeTest(int number, ReentrantLock lock, Condition cond) {
        this.number = number;
        this.lock = lock;
        this.cond = cond;
    }

    public void run() {
        try {
            if (number == 1) {
                put();
            }
            else {
                take();
            }
        }
        catch (InterruptedException ie) { }
    }

    public void put() throws InterruptedException {
        lock.lock();
        try {
            cond.await();
        } finally {
            lock.unlock();
        }
        System.out.println(number);
    }

    public void take() throws InterruptedException {
        lock.lock();
        // wait for put to take the lock
        Thread.sleep(300);
        try {
            cond.signal();
        } finally {
            lock.unlock();
        }
        System.out.println(number);
    } 
}

これはおそらくもっと簡単にコーディングできますが、最近はあまり Java コーディングを行っていません.. :-(

于 2010-12-03T23:06:04.167 に答える
0

これを機能させるために以下を変更することができました.エミュレーターでは機能しなかったことに注意してください(引き続き次々と再生されました)が、電話に配置した後はうまく機能しました.

http://www.droidnova.com/creating-sound-effects-in-android-part-1,570.html

于 2010-12-04T18:41:57.073 に答える
-1

コードを整理する: オブジェクトを作成し、最初にサンプルをロードします。次に、1 つの方法を使用してそれらを再生し、別の方法を使用してそれらを一時停止/解放します。

public class MainActivity extends Activity {

MediaPlayer snd1, snd2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    snd1 = MediaPlayer.create(this, R.raw.s01);
    snd2 = MediaPlayer.create(this, R.raw.s02);
}

public void playSounds(View v) {
    snd1.start();
    snd2.start();
}
public void stopSounds(View v) {
    snd1.pause();
    snd2.pause();
}

}

于 2014-01-20T11:47:43.953 に答える
-1

SoundPool クラスを使用して、2 つのサウンドを同時に再生することができました。

于 2010-12-04T03:10:53.627 に答える