2011-08-17 106 views
3

谷歌搜索後,它似乎是一個常見的問題,但我還沒有找到一個實際的解決方案。我沒有在實際設備上進行測試,但仿真器在完成約80%時切斷了我的聲音剪輯。我正在播放.wav文件。Android 2.2切斷MediaPlayer聲音播放?

有誰知道這些問題的程序化解決方案?

編輯:

public void play(Context context){ 
    if (soundPlayer != null){ 
     soundPlayer.release(); 
    } 

    int rId = 0; 

    switch(aIndex){ 
     case 0: rId = R.raw.c0; break; 
     case 1: rId = R.raw.c1; break; 
     case 2: rId = R.raw.c2; break; 
     case 3: rId = R.raw.c3; break; 
     case 4: rId = R.raw.c4; break; 
     case 5: rId = R.raw.c5; break; 
     case 6: rId = R.raw.c6; break; 
     case 7: rId = R.raw.c7; break; 
     case 8: rId = R.raw.c8; break; 
     case 9: rId = R.raw.c9; break; 
     case 10: rId = R.raw.c10; break; 
     case 11: rId = R.raw.c11; break; 
     case 12: rId = R.raw.c12; break; 
     case 13: rId = R.raw.c13; break; 
     case 14: rId = R.raw.v14; break; 
     case 15: rId = R.raw.v15; break; 
     case 16: rId = R.raw.v16; break; 
     case 17: rId = R.raw.v17; break; 
     case 18: rId = R.raw.v18; break; 
     case 19: rId = R.raw.v19; break; 
     case 20: rId = R.raw.v20; break; 
     case 21: rId = R.raw.v21; break; 
     case 22: rId = R.raw.v22; break; 
     case 23: rId = R.raw.v23; break; 

     default: rId = R.raw.error; break; 
    } 

    soundPlayer = MediaPlayer.create(context, rId); 
    if (soundPlayer != null){ 
     soundPlayer.start(); 
    } 
} 
+0

粘貼使用'MediaPlayer'的代碼。沒有它很難提供幫助。 – pkk

+0

這並不複雜,但它正在被切斷。 –

+0

我會在相信仿真器之前在真實設備上測試 – Blundell

回答

3

那麼對於初學者,我會盡量確保MediaPlayer.create()功能之前start()調用。如果是遊戲,則在開始新遊戲時加載聲音(爲每個聲音創建一個新的媒體播放器)。之所以會這樣,是因爲create函數會有效地將聲音文件加載到那裏,然後在您撥打start時準備好流暢播放。如果您在運行它之前每次加載文件,您不僅會進行比您需要的更多工作,而且可能會對仿真程序產生不良影響。我不確定你是否注意到了,但仿真器並不是真正的實際物理設備的最快工具。因此,我認爲可能發生的情況是仿真器正在「播放」聲音,並認爲在聲音實際播放之前它已完成,主要是由於仿真器速度較慢。

在實際設備上試用它,我認爲你不會有任何問題。

+0

謝謝,我認爲這會有所幫助。您是否推薦通過MediaPlayer對象數組使用SoundPool? –

+2

這取決於。從技術上講,兩者都不如其他。一般來說,MediaPlayer用於提供更長時間的聲音(認爲背景音樂),SoundPool用於聲音效果(點擊,槍擊等)。每種類型也有一些技術限制。MediaPlayer授予查看聲音是否正在播放的功能,而SoundPool則不會。但是,SoundPool可以很容易地設置最大的聲音,並允許同時播放相同的聲音(加載一次),除非您製作出許多具有相同聲音的MediaPlayer,MediaPlayer無法同時播放這些聲音。 – Dororo

+0

我最近遇到了同樣的問題,但在真實設備上運行。 https://stackoverflow.com/questions/48667840/mediaplayer-finishes-playback-earlier-than-it-should 然而,這個問題只能通過提高速度來重現。 – ka3ak

1

我認爲你需要做一個發佈之前開始...例如

if(mPlayer!= null) mPlayer.release(); 

    mPlayer = MediaPlayer.create(this, listaMP3[contador]); 
    mPlayer.start();    
+0

謝謝 - 我在該方法的頂部發布了該版本。儘管如此,它仍然會導致停產。 –

1

爲SOEM原因,如果我定義我用它來播放歌曲的方法之外的媒體播放器,它的工作原理。

即使我只調用playSong()方法一次;

mediaPlayer = MediaPlayer.create(mContext, R.raw.overworld); 
     mediaPlayer.setVolume(musicVolume, musicVolume); 

    playSong(); 

playSong方法:

private void playSong() { 

    if (!mediaPlayer.isPlaying()) 
       mediaPlayer.start(); // no need to call prepare(); create() does that for you 
} 
+0

我得到了同樣的行爲。我的猜測是,由於'start()'不會阻塞,所以方法退出並且MediaPlayer引用被破壞,並且GC可能拾取對象。任何人都可以評論我的猜測? – Ginandi

5

有同樣的問題後,剛發現這個問題。在我的例子中簡單的答案是使MediaPlayer類變量。如果你把它變成本地的方法,那麼垃圾收集器顯然會把它清理出來並且殺死聲音播放。