[故障及解決]SoundPool沒有聲音



問題描述:
使用SoundPool類進行播放聲音時,在手機上沒有聲音。

問題代碼:

/**
 * 聲音播放
 */
private void playSound() {
    SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
    soundPool.load(this, R.raw.beep, 1); // 加載資源,返回1
    soundPool.play(1, 1, 1, 0, 0, 1); // 播放,返回0
}


問題原因:
SoundPool池加載聲音,在調用load方法的時候,是使用其他線程來加載資源的,所以上述代碼在執行play方法的時候,資源還沒有加載,故沒有聲音。

修改方法,就是中間留出足夠的時間來進行加載聲音文件,或追加加載完成的監聽器來監聽是否完成(SoundPool.OnLoadCompleteListener類的方法onLoadComplete(SoundPool soundPool, int sampleId, int status) )。

正確代碼:
因為聲音文件很小,所以就在onCreate方法中加載文件,后面進行播放。

private SoundPool soundPool; // 聲音加載池

protected void onCreate(Bundle savedInstanceState) {
// 門聲音預加載
    soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
    soundPool.load(this, R.raw.beep, 1);
}

/**
 * 聲音播放
 */
private void playSound() {
    soundPool.play(1, 1, 1, 0, 0, 1);
}

知識點延伸:
常用的播放類:
android中,同創進行聲音播放的有MediaPlayer和SoundPool。


MediaPlayer:常用來播放長一些的音頻、視頻和流媒體,每次僅能播放一個,有控制播放的各種方法。
SoundPool:常用來播放短促並且實時性高的音頻,每次可以多個同時播放,比方說游戲中的爆破聲。


SoundPool類的播放方法(部分):


以上述代碼為例,進行分析。當然都有其他的重載的方法。


SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
->

public SoundPool(int maxStream, int streamType, int srcQuality)

初期化一個聲音池。

maxStream:最大可放10個音頻文件。

streamType:為聲音的類型。如上為系統聲音,其他還有音樂,鈴聲等等。

srcQuality:轉化質量,默認為0。目前理解為,播放時的聲音保真程度。一般對於短促的聲音,影響不大。

 

soundPool.load(this, R.raw.beep, 1);

->

public int load(Context context, int resId, int priority)

通過本apk中的資源加載音頻。其他加載方式還有,從Asset對象加載、從FileDescriptor對象加載、從全文件路徑名加載。

context:本context。

resId:資源ID。

priority:加載優先級,一般為1。

返回值為int,表示加載的第幾個文件。從1開始累加。這個返回1。


soundPool.play(1, 1, 1, 0, 0, 1);

->

public int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate);

播放聲音文件。

soundID:表示流中第幾個文件,為load方法的返回值。和load方法配合使用,見過用map進行傳遞數據。(實際上我感覺沒必要)

leftVolume:左音量,通常為1。

rightVolume:右音量,通常為1。

priority:優先度,通常為0。

loop:是否循環。0表示不循環,1以上表示循環次數。

rate:表示播放速率。0.5-2之間。0.5表示減慢50%,2表示加速播放。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM