带有 ~300 个文件的音板 - 我使用什么方法来播放短声音?
Soundboard with ~300 files - what method to play short sounds do I use?
3 天前我开始摆弄 Android Studio,现在我想为《守望先锋》英雄制作音板。
我为这21位英雄每人选择了15个语音文件,所以语音文件会超过300个。
对于每个英雄,我都有一个单独的 activity,其中每个语音文件有 15 个按钮。
XML 个文件都是我喜欢的。
我正在考虑的一点是我播放声音的方法。
首先,我为每个声音使用了 MediaPlayer。但后来我读到 MediaPlayer 不适用于 ~3 秒的声音,我应该使用 SoundPool。
MediaPlayer 工作正常,但如果我向一个按钮发送垃圾邮件,则会有一个巨大的(10 秒)延迟,直到我可以再次播放声音。
我想尝试 SoundPool 库,但每次我想播放声音时,它都会告诉我样本 1 尚未准备好。
不管我等多久,它永远不会完成加载。
我知道我可以添加一个 onLoadCompleteListener 但我必须分别为所有 315 个按钮执行此操作...
如你所见,我有点迷茫。
这是我的代码:(只有一个 activity class 因为其他人仍在使用 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;*/
}
}
}
如果你想进一步帮助我:有没有更好、更优雅的方法来做到这一点?
首先,如果您使用的是 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是同时最大可播放声音数的流声音。
3 天前我开始摆弄 Android Studio,现在我想为《守望先锋》英雄制作音板。 我为这21位英雄每人选择了15个语音文件,所以语音文件会超过300个。
对于每个英雄,我都有一个单独的 activity,其中每个语音文件有 15 个按钮。
XML 个文件都是我喜欢的。
我正在考虑的一点是我播放声音的方法。
首先,我为每个声音使用了 MediaPlayer。但后来我读到 MediaPlayer 不适用于 ~3 秒的声音,我应该使用 SoundPool。 MediaPlayer 工作正常,但如果我向一个按钮发送垃圾邮件,则会有一个巨大的(10 秒)延迟,直到我可以再次播放声音。 我想尝试 SoundPool 库,但每次我想播放声音时,它都会告诉我样本 1 尚未准备好。 不管我等多久,它永远不会完成加载。 我知道我可以添加一个 onLoadCompleteListener 但我必须分别为所有 315 个按钮执行此操作...
如你所见,我有点迷茫。
这是我的代码:(只有一个 activity class 因为其他人仍在使用 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;*/
}
}
}
如果你想进一步帮助我:有没有更好、更优雅的方法来做到这一点?
首先,如果您使用的是 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是同时最大可播放声音数的流声音。