2011-08-31 24 views
4

我正在一个项目中,我必须在一个活动中加载6个不同的声音,并播放所有声音按钮click.The声音文件并不大,但问题是,他们可能会更多。所以我的问题是哪个是加载声音文件在单个活动中最快的方式。出于测试目的,我使用了res/raw文件夹来存储声音文件并尝试用两种不同的方法播放这些文件,但结果并不满意me.Here是两种不同类型的代码:Android最快的方式来加载和播放应用程序中的声音

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

但问题是,这两种方法都需要slow..I要找到一种方法来发挥sounds..but现在有像几乎一秒钟后更快的方法我点击按钮播放声音。

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

有没有想法或建议? 在此先感谢!

+0

您是否尝试过预加载媒体?鉴于你没有太多。 – Jack

+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和情况下,链接发生了改变,this google search如果有人有兴趣的Android音频主题。

0

如果你想有更少的延迟,你必须在C++中使用OpenSL,从糖豆越快声音播放器

0

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

相关问题