2011-08-31 93 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中,因爲解碼文件並將它們存儲在內存中需要很長時間才能使用它們。但是一旦聲音加載完畢,按鍵和聲音輸出之間就沒有明顯的延遲。

相關問題