首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有~300个文件的声板-我用什么方法播放短音?

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

Stack Overflow用户
提问于 2016-05-14 22:29:53
回答 1查看 660关注 0票数 0

3天前,我开始和Android混在一起,现在我想为观看英雄制作一个声板。我为这21个英雄中的每一个选择了15个语音文件,所以它将是>300个语音文件。

对于每一个英雄,我有一个单独的活动,在其中有15个按钮为每个声音文件。

XML文件都是按照我的喜好完成的。

我正在反复思考的一点是我演奏声音的方法。

首先,我对每个声音都使用了MediaPlayer。但后来我读到,MediaPlayer不是为3秒钟的声音准备的,我应该使用SoundPool。MediaPlayer运行良好,但如果我垃圾邮件的一个按钮,有一个巨大(10秒)的延迟,直到我可以再次播放声音。我想尝试一下SoundPool库,但是每次我想播放声音时,它都会告诉我示例1还没有准备好。不管我等多久,它永远不会完成装货。我知道我可以添加一个onLoadCompleteListener,但我必须对所有315个按钮分别这样做.

你看,我有点迷路了。

下面是我的代码:(只是一个活动类,因为其他类仍然使用MediaPlayer.

代码语言:javascript
复制
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;*/
        }
    }
}

如果你想进一步帮助我:有没有更好、更优雅的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-28 15:54:04

首先,如果您正在使用wav或类似的东西,不要。使用.ogg文件来播放SoundPool。这大大减少了延迟,提高了性能。

那你应该把你315号的声音分开。每个声音池对象应该负责15-20个声音。使用这种方法,您可以轻松加载315声音,但这可能是一些老设备的问题。

此外,由于Android的诽谤,你不能在同一时间播放超过24-25个声音。(参考文献:AudioFlinger could not create track. status: -12)

注意:您应该以这种格式使用SoundPool:

代码语言:javascript
复制
    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同时是最大可播放声音数的流音。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37232558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档