我正试图在android中同时播放两个声音。我创建了两个MediaPlayers并使用下面的代码。他们正在一个接一个播放。或者不是一个接一个但是有点延迟到彼此。
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();
}
由于
答案 0 :(得分:5)
同时播放两个数字声音就像将它们相加在一起一样简单(就像在现实世界中一样),所以你可以在填充缓冲区时自己做(并控制时间)。
这可能会导致幅度上升,因此如果您不想导致剪切瑕疵,请注意不要超过数组类型的数值范围。
This question and answer也可能会有所帮助
答案 1 :(得分:2)
在完全同时做两件事是困难的。在单线程环境中,操作系统需要在线程之间跳转以模拟它们同时运行。因此,为了能够在“同一时间”运行它们,您需要启动两个线程并等待它们到达它们应该同步的点,然后让两个线程现在它们应该继续。
另一种解决方案是将两个声音流合并,这样听起来好像它是两个声音,当它实际上是一个时。尽管我不是那么精通声音操作,但绝对不是在Android上......
第一个解决方案是生成两个线程,同时启动它们然后使用wait()
和notify()
让它们同时调用MediaPlayer.start()
,可能与Lock班。
好的,所以如何同步两个线程(基于示例here)的一个很长的例子是:
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编码..: - (
答案 2 :(得分:0)
我能够修改以下内容以使其工作。应该注意它在模拟器中不起作用(它们仍然一个接一个地播放),但在将它放在手机上之后效果很好。
http://www.droidnova.com/creating-sound-effects-in-android-part-1,570.html
答案 3 :(得分:-1)
通过使用SoundPool类,我能够在同一时间播放两种声音。
答案 4 :(得分:-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();
}
}