Android是在应用程序中加载和播放声音的最快方式

时间:2011-08-31 22:33:23

标签: android soundpool android-audiomanager

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

方法1:

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();
                    }

                });
            }
        });

方法2:

    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);
    };

但问题是这两种方法都很慢。我需要找到一种更快速播放声音的方法..但现在我点击按钮播放声音后差不多一秒钟。

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

那么任何想法或建议? 提前谢谢!

3 个答案:

答案 0 :(得分: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文件),有多个音轨可以随意静音和取消静音。我没有个人经验,只是阅读了一些文档,但对于任何有多种声音的情况,它似乎都非常有用。

编辑:此外,值得一提的是this mailing list,如果有人对Android音频主题感兴趣,则链接会发生变化this google search

答案 1 :(得分:0)

如果你想减少延迟,你必须在c ++中使用OpenSL,从果冻豆是更快的声音播放器

答案 2 :(得分:0)

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