在我的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
答案 0 :(得分:0)
要同时播放多个曲目,您应该使用AsyncTask并在THREAD_POOL_EXECUTOR上执行它。
怎么做:
主题类:
export PATH
媒体播放器:
class PlayThread extends AsyncTask<MediaPlayer, Void, Void>
{
@Override
protected Void doInBackground(MediaPlayer... player) {
player[0].start();
return null;
}
}
AsyncTask只能同时执行5个线程,其他的将进入队列。
SoundPool缓冲区限制为1Mb,因此根本不是解决方案。
非常重要:
要同时播放更多音频曲目,您应该将它们混合到1个缓冲区中
执行此操作的方法:将mp3解码为pcm(以流模式转换为小缓冲区),将其混合到一个字节缓冲区中并将其放入AudioTrack进行播放。
答案 1 :(得分:0)
我建议不要在上面定义MediaPlayer。 只需在每个ButtonClick
创建一个新的临时MediaPlayererror TS2693: 'ServiceFunction' only refers to a type, but is being used as a value here.
它将同时播放声音
<强>更新强>
如果您想在完成播放声音后销毁MediaPlayer,可以使用此代码执行此操作
new MediaPlayer.create(this, R.raw.clap).start();