gpt4 book ai didi

android 音频 - soundpool 替代品

转载 作者:行者123 更新时间:2023-11-29 21:57:46 26 4
gpt4 key购买 nike

我喜欢 Android Soundpool 类,因为它很简单,而且它可以很好地处理我在我的应用程序中使用的标准音频文件。现在我想让用户可以通过指定 sd 卡上的音频文件来指定某些声音。不幸的是,我遇到了 Soundpool 的限制,当声音文件太大时,我得到一个

AudioFlinger 无法创建音轨。状态:-12

响应。看来我必须切换到 MediaPlayer 但在再次进入 MediaPlayer 的复杂性之前我想问一下是否有适用于 android 的音频库

  • 具有 Soundpool 的简单性,可播放各种声音
  • 在文件大小方面没有 Soundpool 的限制。

非常感谢。

马丁

最佳答案

现在我想到了一个非常简单的 AudioPool 类,它播放随后使用 MediaPlayer 类添加到其中的音频。这个实现肯定还不成熟,但我只是想分享它,因为它至少给出了一些如何轻松实现的想法。如果您发现此类有任何问题,请告诉我们。

用法:

 AudioPool ap = new AudioPool();

File root = Environment.getExternalStorageDirectory() ;

int id1 = ap.addAudio(root + "/gong1.mp3");
int id2 = ap.addAudio(root + "/gong2.mp3");
int id3 = ap.addAudio(root + "/gong3.mp3");

ap.playAudio(id1);
ap.playAudio(id3);
ap.playAudio(id3);
ap.playAudio(id2);

随后将播放 gong1 -> gong3 -> gong3 -> gong1。因为这基本上是我需要的,所以我把它留在这里......

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;

import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.util.Log;

public class AudioPool {

static String TAG = "AudioPool";

MediaPlayer mPlayer;

int mAudioCounter;

int mCurrentId;

HashMap<Integer, String> mAudioMap;

LinkedList<Integer> mAudioQueue;

public AudioPool() {

mAudioMap = new HashMap<Integer, String>();
mAudioQueue = new LinkedList<Integer>();
mAudioCounter = 0;

}

public int addAudio(String path) {
Log.d(TAG, "adding audio " + path + " to the pool");

if (mAudioMap.containsValue(path)) {
return getAudioKey(path);
}
mAudioCounter++;
mAudioMap.put(mAudioCounter, path);
return mAudioCounter;
}

public boolean playAudio(int id) {

if (mAudioMap.containsKey(id) == false) {
return false;
}

if (mPlayer == null) {
setupPlayer();
}

if (mPlayer.isPlaying() == false) {
return prepareAndPlayAudioNow(id);
} else {
Log.d(TAG, "adding audio " + id + " to the audio queue");

mAudioQueue.add(id);
}
return true;
}

public Integer[] getAudioIds() {
return (Integer[]) mAudioMap.keySet().toArray(
new Integer[mAudioMap.keySet().size()]);
}

public void releaseAudioPlayer() {
if (mPlayer != null) {
mPlayer.release();
mPlayer = null;
}
}


private boolean prepareAndPlayAudioNow(int id) {
mCurrentId = id;
try {
Log.d(TAG, "playing audio " + id + " now");
mPlayer.reset();
mPlayer.setDataSource(mAudioMap.get(id));
mPlayer.prepare();
mPlayer.start();
return true;
} catch (Exception e) {
Log.d(TAG, "problems playing audio " + e.getMessage());
return false;
}
}

private boolean playAudioAgainNow() {
try {
mPlayer.seekTo(0);
mPlayer.start();
return true;
} catch (Exception e) {
Log.d(TAG, "problems playing audio");
return false;
}
}

private void setupPlayer() {
mPlayer = new MediaPlayer();
mPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
audioDone();
}
});
}

private void audioDone() {

if (mAudioQueue.size() > 0) {
Log.d(TAG, mAudioQueue.size() + " audios in queue");
int nextId = mAudioQueue.removeFirst();

if (mCurrentId == nextId) {
playAudioAgainNow();
} else {
prepareAndPlayAudioNow(nextId);
}

} else {
releaseAudioPlayer();
}
}

private int getAudioKey(String path) {
for (Map.Entry<Integer, String> map : mAudioMap.entrySet()) {
if (map.getValue().compareTo(path) == 0) {
return map.getKey();
}
}
return -1;
}

}

关于android 音频 - soundpool 替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12795547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com