3天前,我开始和Android混在一起,现在我想为观看英雄制作一个声板。我为这21个英雄中的每一个选择了15个语音文件,所以它将是>300个语音文件。
对于每一个英雄,我有一个单独的活动,在其中有15个按钮为每个声音文件。
XML文件都是按照我的喜好完成的。
我正在反复思考的一点是我演奏声音的方法。
首先,我对每个声音都使用了MediaPlayer。但后来我读到,MediaPlayer不是为3秒钟的声音准备的,我应该使用SoundPool。MediaPlayer运行良好,但如果我垃圾邮件的一个按钮,有一个巨大(10秒)的延迟,直到我可以再次播放声音。我想尝试一下SoundPool库,但是每次我想播放声音时,它都会告诉我示例1还没有准备好。不管我等多久,它永远不会完成装货。我知道我可以添加一个onLoadCompleteListener,但我必须对所有315个按钮分别这样做.
你看,我有点迷路了。
下面是我的代码:(只是一个活动类,因为其他类仍然使用MediaPlayer.
package eleumnoyce.newsoundboard;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import java.util.HashMap;
public class genji extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_genji);
}
public void genjiClick(View v) { //genjiClick is the OnClick in my XML
int afterthis = 1;
SoundPool genjiPool;
HashMap<Integer, Integer> genjiMap;
setVolumeControlStream(AudioManager.STREAM_MUSIC);
genjiPool = new SoundPool(14, AudioManager.STREAM_MUSIC, 100);
genjiMap = new HashMap<Integer, Integer>();
genjiMap.put(afterthis, genjiPool.load(this, R.raw.genjiafterthis, 1));
switch (v.getId()) {
case R.id.genji1: genjiPool.play(genjiMap.get(afterthis), 1, 1, 0, 0, 1);
/*case R.id.genji2:
mPlayer = MediaPlayer.create(this, R.raw.genjiasteadyblade);
mPlayer.start();
break;
case R.id.genji3:
mPlayer = MediaPlayer.create(this, R.raw.genjifatesmiles);
mPlayer.start();
break;
case R.id.genji4:
mPlayer = MediaPlayer.create(this, R.raw.genjiflowlike);
mPlayer.start();
break;
case R.id.genji5:
mPlayer = MediaPlayer.create(this, R.raw.genjiiamcertain);
mPlayer.start();
break;
case R.id.genji6:
mPlayer = MediaPlayer.create(this, R.raw.genjiinbalancefind);
mPlayer.start();
break;
case R.id.genji7:
mPlayer = MediaPlayer.create(this, R.raw.genjijustmystyle);
mPlayer.start();
break;
case R.id.genji8:
mPlayer = MediaPlayer.create(this, R.raw.genjijustsettingfoot);
mPlayer.start();
break;
case R.id.genji9:
mPlayer = MediaPlayer.create(this, R.raw.genjimeasuretwice);
mPlayer.start();
break;
case R.id.genji10:
mPlayer = MediaPlayer.create(this, R.raw.genjimybladeis);
mPlayer.start();
break;
case R.id.genji11:
mPlayer = MediaPlayer.create(this, R.raw.genjirevenge);
mPlayer.start();
break;
case R.id.genji12:
mPlayer = MediaPlayer.create(this, R.raw.genjisomehingfor);
mPlayer.start();
break;
case R.id.genji13:
mPlayer = MediaPlayer.create(this, R.raw.genjitheresnotime);
mPlayer.start();
break;
case R.id.genji14:
mPlayer = MediaPlayer.create(this, R.raw.genjitoknowyourself);
mPlayer.start();
break;*/
}
}
}如果你想进一步帮助我:有没有更好、更优雅的方法来做到这一点?
发布于 2016-05-28 15:54:04
首先,如果您正在使用wav或类似的东西,不要。使用.ogg文件来播放SoundPool。这大大减少了延迟,提高了性能。
那你应该把你315号的声音分开。每个声音池对象应该负责15-20个声音。使用这种方法,您可以轻松加载315声音,但这可能是一些老设备的问题。
此外,由于Android的诽谤,你不能在同一时间播放超过24-25个声音。(参考文献:AudioFlinger could not create track. status: -12)
注意:您应该以这种格式使用SoundPool:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
AudioAttributes attributes = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA)
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();
mSoundPool = new SoundPool.Builder().setAudioAttributes(attributes).setMaxStreams(6).build();
} else {
mSoundPool = new SoundPool(6, AudioManager.STREAM_MUSIC, 0);
}6同时是最大可播放声音数的流音。
https://stackoverflow.com/questions/37232558
复制相似问题