1

我有一个关于在 android 中播放/暂停多个音频文件的问题。我们的应用程序使用 restful api 从服务器加载音频文件。在 api 中将有访问音频文件的链接(如http://www.common.com/folder/folder1/file1.mp4)。我们的应用程序将在 android 活动的列表视图中列出音频文件的名称。一旦用户点击 file1,file1 就会开始播放。当用户点击另一个文件时,file1 会暂停播放并开始播放被点击的文件。这应该发生在所有文件中。

我们的疑问是,我们是否需要使用媒体播放器的多个实例来播放不同的音频文件。像每个文件的新 MediaPlayer() 对象一样吗?我们可以用一个 MediaPlayer 实例来处理这种情况吗?SoundPool 在这种情况下有帮助吗?

4

1 回答 1

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;
  }
}
于 2013-04-30T12:50:56.337 回答