2013-04-30 138 views
1

我有一個關於在an​​droid中播放/暫停多個音頻文件的問題。我們的應用程序使用restful API從服務器加載音頻文件。在api中將有鏈接訪問音頻文件(如http://www.common.com/folder/folder1/file1.mp4)。我們的應用程序將在android活動列表視圖中列出音頻文件的名稱。一旦用戶點擊file1,那麼file1開始播放。當用戶點擊另一個文件時,file1會暫停播放並開始播放所點擊的文件。這應該發生在所有文件中。在android中播放或暫停多個音頻文件

我們的疑問是,我們是否需要使用媒體播放器的多個實例來播放不同的音頻文件。像每個文件的新MediaPlayer()對象一樣?我們可以通過一個MediaPlayer實例來處理這種情況嗎? SoundPool在這種情況下有幫助嗎?

回答

1

是的,Soundpool可能會有幫助,如果你想有這個過程中的播放/暫停。

首先創建一個保存在活動實例中的聲音管理器,以及一個將音頻文件鏈接到ID的映射。

// Replace 10 with the maximum of sounds that you would like play at the same time. 
SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 100); 
HashMap<String, Integer> stringToSoundID = new HashMap<String, Integer>(); 
HashMap<Integer, Integer> soundIdToStreamID = new HashMap<Integer, Integer>(); 
Integer streamIDbeingPlayed= -1; 

然後將所有聲音加載到soundPool中,保持文件和聲音ID之間的鏈接。

for(String filePath: Files) { 
    int soundID = soundPool.load(filePath, 1); 
    stringToSoundID.put(filePath, soundID); 
} 

然後你可以有你的功能,播放/暫停像這樣的文件:

void playFile(String filePath) { 
    if(streamIDbeingPlayed!= -1) { 
    soundPool.pause(streamIDbeingPlayed); 
    } 
    Integer soundID = stringToSoundID.get(filePath); 
    Integer streamID = soundIdToStreamID.get(soundID); 
    if(streamID == null) { 
    streamIDbeingPlayed = soundPool.play (soundID, 1, 1, 1, -1, 1); 
    soundIdToStreamID.put(soundID, streamIDbeingPlayed); 
    } else { 
    soundPool.resume(streamID); 
    streamIDbeingPlayed = streamID; 
    } 
} 
+0

感謝您的回答。但是,當我們使用soundpool時,它不會將播放的當前位置和音頻的總持續時間返回給我。這些細節我用於更新進度條... – developerXXX 2013-05-08 09:20:30

+0

SoundPool用於小型音頻文件。 – 2016-01-13 06:39:49