音板有~300个文件 - 我用什么方法播放短音?

时间:2016-05-14 22:29:54

标签: java android audio bulk

3天前我开始搞乱Android Studio,现在我想为Overwatch英雄制作一个音板。 我为这21位英雄中的每一位选择了15个语音文件,因此它将是> 300个语音文件。

对于每个英雄我都有一个单独的活动,每个语音文件有15个按钮。

XML文件都是我喜欢的。

我想到的是我的播放声音的方法。

首先,我为每个声音使用了MediaPlayer。但后来我读到MediaPlayer不是用于~3秒的声音而且我应该使用SoundPool。 MediaPlayer运行良好,但是如果我发送垃圾邮件一个按钮就会有一个巨大的(10秒)延迟,直到我再次播放声音。 我想尝试一下SoundPool lib,但每次我想播放声音时都会告诉我样品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;*/
        }
    }
}

如果你想进一步帮助我:是否有更好,更优雅的方式来做到这一点?

1 个答案:

答案 0 :(得分:1)

首先,如果您使用的是wav或类似的东西,请不要这样做。使用.ogg文件来播放SoundPool。这减少了延迟并显着提高了性能。

然后你应该分开你的315个声音。每个soundpool对象应该负责大约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 是同时为最大可播放声音编号的流声音。