Воспроизведение двух звуков Simutaneosly - PullRequest
7 голосов
/ 04 декабря 2010

Я пытаюсь воспроизвести два звука одновременно в Android. Я создал два MediaPlayer и использую приведенный ниже код. В настоящее время они воспроизводятся один за другим.1002 *

Спасибо

Ответы [ 5 ]

5 голосов
/ 04 декабря 2010

Воспроизведение двух цифровых звуков одновременно так же просто, как их суммирование (как в реальном мире), так что вы можете сделать это самостоятельно, заполняя буфер (и контролировать время).

Это может привести кчтобы увеличить амплитуду, поэтому следует соблюдать осторожность, чтобы не превысить числовые границы типа массива, если вы не хотите вызывать обтравочные артефакты.

Этот вопрос и ответ также могут бытьполезно

2 голосов
/ 04 декабря 2010

Делать две вещи в точно в одно и то же время ... сложно.В однопоточной среде ОС необходимо переключаться между потоками, чтобы имитировать их одновременную работу.Таким образом, чтобы иметь возможность запускать их в одно и то же время, вам нужно запустить два потока и подождать, пока они достигнут точки, где они должны быть синхронизированы, а затем дать обоим потокам возможность продолжить.* Другим решением было бы объединить два звуковых потока так, чтобы звучало так, как будто два звука воспроизводятся, когда он на самом деле один.Хотя я не настолько опытен в манипулировании звуком, и определенно не на Android ...

Первым решением было бы создать два потока, запустить их оба, а затем использовать wait() и * 1008.* чтобы они вызывали MediaPlayer.start() одновременно, возможно, с классом Lock .


Хорошо, так что длинный пример того, как синхронизировать два потока (на основепример здесь :

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-кодированием в последнее время ..: - (

0 голосов
/ 20 января 2014

Организуйте свой код: сначала создайте объекты и загрузите образцы.Затем используйте один метод, чтобы воспроизвести их, а другой - приостановить / отпустить.

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

}

0 голосов
/ 04 декабря 2010

Мне удалось изменить следующее, чтобы заставить это работать. Следует отметить, что он не работал в эмуляторе (они все еще играли один за другим), но после помещения его в телефон он работал отлично.

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

0 голосов
/ 04 декабря 2010

Мне удалось воспроизвести два звука одновременно, используя класс SoundPool.

...