2012-12-14 32 views
10

Tôi muốn phát âm thanh sau khi chạm vào nút. MediaPlayer hoạt động tốt, nhưng tôi đọc ở đâu đó rằng thư viện này là dành cho dài .wav (như âm nhạc).Phát các tệp .wav ngắn - Android

Có cách nào tốt hơn để phát ngắn .wav (2-3 giây) không?

+4

Đúng, ['SoundPool'] (http://developer.android.com/reference/android/media/SoundPool.html) là cách để thực hiện. – kcoppock

Trả lời

24

SoundPool là lớp chính xác cho việc này. Mã dưới đây là một ví dụ về cách sử dụng nó. Nó cũng là mã tôi sử dụng trong một số ứng dụng của tôi để quản lý âm thanh. Bạn có thể có âm thanh như bạn muốn (hoặc như giấy phép bộ nhớ).

public class SoundPoolPlayer { 
    private SoundPool mShortPlayer= null; 
    private HashMap mSounds = new HashMap(); 

    public SoundPoolPlayer(Context pContext) 
    { 
     // setup Soundpool 
     this.mShortPlayer = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 


     mSounds.put(R.raw.<sound_1_name>, this.mShortPlayer.load(pContext, R.raw.<sound_1_name>, 1)); 
     mSounds.put(R.raw.<sound_2_name>, this.mShortPlayer.load(pContext, R.raw.<sound_2_name>, 1)); 
    } 

    public void playShortResource(int piResource) { 
     int iSoundId = (Integer) mSounds.get(piResource); 
     this.mShortPlayer.play(iSoundId, 0.99f, 0.99f, 0, 0, 1); 
    } 

    // Cleanup 
    public void release() { 
     // Cleanup 
     this.mShortPlayer.release(); 
     this.mShortPlayer = null; 
    } 
} 

Bạn sẽ sử dụng này bằng cách gọi:

SoundPoolPlayer sound = new SoundPoolPlayer(this); 

trong onCreate Hoạt động của bạn() (hoặc bất cứ lúc nào sau khi nó). Sau đó, để chơi một cuộc gọi đơn giản âm thanh:

sound.playShortResource(R.raw.<sound_name>); 

Cuối cùng, khi bạn đang thực hiện với các âm thanh, hãy gọi:

sound.release(); 

để giải phóng tài nguyên.

+0

Nó hoạt động rất tốt, nhưng tôi có hai câu hỏi. 1. Tôi phải relase sau mỗi lần sử dụng (như MediaPlayer) hoặc có thể khi tôi thoát khỏi ứng dụng // hoạt động? 2. Có cách nào để dừng mẫu? – CookieMonssster

+0

Bạn chỉ nên phát hành nó khi bạn chơi xong bất kỳ âm thanh nào cho toàn bộ phiên ứng dụng (do đó onDestroy() sẽ là một lựa chọn tốt). Bạn có thể thêm phương thức pause() sử dụng phương thức [pause() của SoundPools] (http://developer.android.com/reference/android/media/SoundPool.html#pause (int)). –

+0

Điều này thật dễ dàng. FWIW, Eclipse đã đề xuất 'SparseIntArray()' cho 'mSounds' để có hiệu suất tốt hơn, vì vậy đó là những gì tôi đã làm. –

Các vấn đề liên quan