2012-10-21 26 views
4

什麼是目前正與我的Android應用程序發生播放同一文件:使用的MediaPlayer多次與重疊

我映射一個簡單的圖像按鈕,並讓它在點擊播放聲音。每次點擊時,我在原始文件夾中創建一個帶有聲音文件的MediaPlayer對象,爲該MediaPlayer對象設置一個OnClickListener,該對象將停止播放該文件並將其釋放,然後播放MediaPlayer對象。

爲定義的部分代碼:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main_activity); 
    ImageButton start = (ImageButton) findViewById(R.id.imageButton1); 
    start.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      MediaPlayer play = MediaPlayer.create(MainActivity.this, R.raw.dvno); 
      play.setOnCompletionListener(new OnCompletionListener() { 
       public void onCompletion(MediaPlayer mp) { 
        mp.stop(); 
        mp.release(); 
        mp = null; 
       } 
      }); 
      play.start(); 
     } 
    }); 
} 

有什麼不妥的地方:

它工作正常,並不會崩潰,但它是可怕的記憶和一般很慢。我希望用戶能夠儘可能快地點擊按鈕多次,並且聽到瞬間重複播放的聲音。每次點擊創建一個新的MediaPlayer對象並等待它完成並釋放時,會消耗太多資源,並且聲音往往落後於實際按下按鈕。我希望能夠創建一個單獨的聲音作爲MediaPlayer對象,它可以在重疊播放時播放。

可能的解決方案:

中的onCreate而不是的onClick範圍創建一個最終的MediaPlayer對象,並以某種方式使用線程開始的每次點擊的MediaPlayer對象。我讀到這可能是一個可能的解決方案,但我之前從未使用過線程,我不知道它們是否比我當前的代碼慢,如果不慢,所以我想知道是否有解決方案,而不使用可能更簡單的線程。在這一點上操作單個MediaPlayer的狀態似乎是不可能的,但也許我錯了。

這會因爲非法狀態而導致程序崩潰嗎?如果不是,這會比我想要的慢嗎?如果沒有,任何人都可以提出修正我的代碼?

+0

我認爲一個SoundPool真的會更適合這裏根據您的要求。 MediaPlayer是一個非常重的高延遲對象,通常用於播放視頻和長音樂曲目。 SoundPool用於保存將以低延遲快速播放,重疊播放的短片。剪輯初始化一次,然後每次您想播放聲音時都可以調用播放。我相信唯一的限制是未壓縮的聲音必須小於1MB,儘管我不積極。 – Tim

回答

5

我建議你使用SoundPool而不是MediaPlayer。 教程是here

+0

我接受了您的建議並最終切換到SoundPool。絕對更容易,更易於管理和更快速。儘管在模擬器中,聲音在短片尾部略微波動。它可能只是模擬器。 – Maharlikans

+0

+1爲我工作,蹩腳的媒體播放器失敗(通過跳過和剪輯音頻文件) – Dori