【问题标题】:Playing two sounds Simutaneosly同时播放两个声音
【发布时间】:2011-05-20 00:14:49
【问题描述】:

我正在尝试在 android 中同时播放两种声音。我创建了两个 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();

      }

谢谢

【问题讨论】:

  • “延迟”是什么意思,是秒,微秒,还是十秒?您希望它们彼此靠近多长时间播放,恰好同时播放,而不是更早一点?
  • 非常短...微秒。我希望它们在完全相同的时间播放是的。
  • 我的意思是当他们玩的时候,他们彼此之间的时间有点延迟。我只是希望他们俩同时玩游戏。
  • 我迫切需要实现同样的目标。想知道混合是如何进行的。有解决的机会吗?

标签: android audio media-player soundpool android-audiomanager


【解决方案1】:

同时播放两个数字声音就像将它们相加一样简单(就像在现实世界中一样),因此您可以在填充缓冲区的同时自己做这件事(并且可以控制时间)。

这可能会导致幅度升高,因此如果您不想导致剪切伪影,请注意不要超过数组类型的数值范围。

This question and answer 也可能有帮助

【讨论】:

  • 谢谢,但就我目前的知识而言,似乎进步了!
【解决方案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 编码.. :-(

【讨论】:

  • 如果不是太麻烦或者不会花太长时间。你会不会碰巧有一些演示代码。如果没有那没关系。我发现使用 midi 足以满足我的需求。
  • @james:不幸的是没有。我可以尝试编写一个小的 Java 示例(它不会很漂亮),但目前我没有任何 Android 手机可以测试它。
  • @james:提供了一个(长)示例。很多代码只用于同步两个线程,但我警告过你它不会很漂亮。 ;-)
【解决方案3】:

我能够修改以下内容以使其正常工作。需要注意的是,它在模拟器中不起作用(他们仍然在一个接一个地玩),但放在手机上后效果很好。

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

【讨论】:

  • 抱歉这些问题,但我想确保我遵循您的解决方案。所以最后你只是打电话;播放声音(1);播放声音(2);播放声音(3);播放声音(4);我个人发现这仍然对我不起作用。如果你做了除此之外的事情,你能解释一下吗?谢谢。
【解决方案4】:

通过使用 SoundPool 类,我能够同时播放两种声音。

【讨论】:

  • 如果你是连续调用它们……那么它们确实不是同时启动的,会有很小的延迟。它将允许声音重叠,但时间在这里很重要。
  • 如果您找到了解决方案,您可以更新您的帖子或回答您自己的问题吗?
【解决方案5】:

组织您的代码: 首先创建对象并加载示例。然后使用一种方法播放它们,另一种方法暂停/释放它们。

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

}

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多