同时按下按钮播放声音
在我的Launchpad Simulator
主活动中有很多按钮。
我想按每个按钮播放声音。如果同时按下按钮,我想同时播放声音。从我现在所做的事情来看,似乎每当我按下按钮时它都会播放声音,但是因为第一个声音的长度是3秒(例如,拍子声音文件在播放时间长度为3秒)。同时按下按钮播放声音
在通过按钮产生任何其他声音之前,它会等待3秒钟,如果在3秒后按任何按钮并与其他32按钮相同,则会播放下一个声音。
只要按下按钮,就像启动板一样,我想要播放声音。在这种情况下,拍手的声音。
这里是Java代码:
MainActivity.java
package com.oniichansblog.launchpadify;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.media.MediaPlayer;
public class MainActivity extends AppCompatActivity {
private MediaPlayer clap1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clap1 = MediaPlayer.create(this, R.raw.clap1);
}
public void clap1(View v){
clap1.start();
}
}
我只有这一个功能clap1()
正在被反复调用,每次我按下一个按钮。
,如果你想看看自己我有一个存储库: GitHub Repository for LaunchPadify
我建议不要定义上面的MediaPlayer。 只需创建一个新的临时MediaPlayer的每一个ButtonClick
new MediaPlayer.create(this, R.raw.clap).start();
,它会同时播放声音
UPDATE
如果你想播放完声音后销毁的MediaPlayer,你可以做这使用此代码
new MediaPlayer.create(getApplicationContext(), R.raw.test)
.start()
.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.release();
}
});
要播放的几个音轨同时,你应该使用AsyncTask并执行它THREAD_POOL_EXECUTOR。
如何做到这一点:
Thread类:
class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
{
@Override
protected Void doInBackground(MediaPlayer... player) {
player[0].start();
return null;
}
}
媒体播放器:
MediaPlayer[] players = new MediaPlayer[5];
//Then set source to each player...
//...
//Create objects of Thread class
PlayThread[] playThreads = new PlayThread[5];
for (int i = 0; i < 5; i++)
playThreads[i] = new PlayThread();
//Set Media Players there and start play
for (int i = 0; i < 5; i++)
playThreads[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, players[i]);
AsyncTask可以同时执行只有5个线程,其他将要排队。
SoundPool缓冲区限制为1MB,所以它不是一个解决方案在所有。
这是非常重要的:
同时播放多音轨,你应该将它们混合到1个缓冲。
要做到这一点:将mp3解码为pcm(以流模式下的小缓冲区),将其混合到一个字节缓冲区并将其放到AudioTrack进行播放。
其实,我有几个问题:这是什么意思是'doInBackground(MediaPlayer ... player)',我不明白为什么会有三个点?接下来你说要给玩家添加一些资源。我可以设置来源。但在接下来的部分中,您将设置Mediaplayer并开始播放。说实话,我是新来的声音和线程。所以,如果你能更清楚地说明你的代码,就像一对一的教程一样,我可以用它作为例子,并根据自己的需要进行编辑。我也不明白**这是非常重要的部分** – Shanu
是的,它工作得很好,但按下几个按钮后,它停止鼓掌。我将留下一个链接到应用程序。如果你能亲眼看到它在击中10-15次后停止发出声音的方式。 https://drive.google.com/open?id=0B5whGfbIoM7KVE56clVXY2dSUFU – Shanu
是的,这是由Media Player对象溢出引起的。您需要添加一个onCompletionListener,然后在播放完声音后释放(销毁)MediaPlayer。 –
请您详细说明。我是新的声音 – Shanu