4

我正在做一个项目,我必须在一个活动中加载 6 种不同的声音,并在单击按钮时播放所有声音。声音文件不是那么大,但问题是它们可能会更多。所以我的问题是这是在单个活动中加载声音文件的最快方法。出于测试目的,我使用 res/raw 文件夹来存储声音文件并尝试使用两种不同的方法来播放文件,但结果并不让我满意。这是两种不同类型的代码:

方法一:

Button first = (Button) findViewById(R.id.one);
Button second = (Button) findViewById(R.id.two);
first.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumtwo);
                mp.start();
                mp.setOnCompletionListener(new OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }

                });
            }
        });

second.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                MediaPlayer mp = MediaPlayer.create(SoundFXActivity.this, R.raw.drumone);
                mp.start();
                mp.setOnCompletionListener(new OnCompletionListener() {

                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.release();
                    }

                });
            }
        });

方法二:

    private SoundPool spool;
    private int soundID,soundID2;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        spool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
        soundID = spool.load(this, R.raw.drumone, 1);
        soundID2 = spool.load(this, R.raw.drumtwo, 1);

        Button three = (Button) findViewById(R.id.three);



        three.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Sound();

            }
        });



    }

    public void Sound(){
        AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
        float volume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
        spool.play(soundID, volume, volume, 1, 0, 1f);
    };

但问题是这两种方法都很慢..我需要找到一种更快的方法来播放声音..但是现在我点击按钮播放声音后几乎有一秒钟的时间。

你能给我一些建议如何更快地播放声音吗?我应该在应用程序启动时将它们加载到缓存中还是将它们保存在数据库或其他地方(事实上,我认为数据库不是一个好的选择,但是我想听听一些建议)。或者也许从资产文件夹中加载它们,但我认为它仍然会很慢。

那么有什么想法或建议吗?提前致谢!

4

3 回答 3

2

您可以在您的中创建媒体播放器,onCreate然后按钮将让它们播放。我会说,那将是最简单的解决方案。

或者,根据它对您的重要性以及您想做多少工作,您可以考虑使用 JetPlayer:

这是媒体的android开发页面:http:
//developer.android.com/guide/topics/media/index.html

JetPlayer 类的页面:http:
//developer.android.com/reference/android/media/JetPlayer.html

以及创建 JET 文件的页面:http:
//developer.android.com/guide/topics/media/jet/jetcreator_manual.html

如果你实现了这个,它可能会工作得最好,但肯定是最多的工作。

JetPlayer 基本上让您拥有一个音频文件(我认为它是一个 MIDI 文件),其中包含多个轨道,您可以随意静音和取消静音。我没有个人经验,只是阅读了一些文档,但它似乎对于任何有多个声音的情况都非常有用。

编辑:另外,值得一提的是这个邮件列表,以防万一链接改变了这个谷歌搜索,以防有人对安卓音频主题感兴趣。

于 2011-09-01T04:22:59.740 回答
0

SoundPool 工作正常,您可以查看Hexiano项目的示例。但是,您必须将声音预加载到 SoundPool 中,因为在能够使用它们之前解码文件并将它们存储在内存中需要很长时间。但是一旦加载了声音,按键和声音输出之间就没有明显的延迟。

于 2014-11-02T22:55:03.250 回答
0

如果你想有更少的延迟,你必须在 C++ 中使用 OpenSL,From jelly bean 是更快的声音播放器

于 2014-04-30T09:34:46.900 回答