有人知道学习 Android 音频 DSP 的有用链接吗? 或者声音库?
我试图制作一个基本的混音器来播放 wav 文件,但意识到我对 dsp 的了解不够,而且我根本找不到适用于 android 的任何内容。
我有一个 wav 文件加载到字节数组中,并且在一个短循环上有一个 AudioTrack。 我如何输入数据?
FileInputStream is = new FileInputStream(filePath);
BufferedInputStream bis = new BufferedInputStream(is);
DataInputStream dis = new DataInputStream(bis);
int i = 0;
while (dis.available() > 0) {
byteData[i] = dis.readByte(); //byteData
i++;
}
final int minSize = AudioTrack.getMinBufferSize( 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT );
track = new AudioTrack( AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT,
minSize, AudioTrack.MODE_STREAM);
track.play();
bRun=true;
new Thread(new Runnable() {
public void run() {
track.write(byteData, 0, minSize);
}
}).start();
我会尝试一下,因为几个月前我处于你的位置......
如果您已经拥有字节数组中的 wav 文件音频样本,则只需将样本传递到音轨对象(查找 write() 方法)。
要将音频混合在一起,您只需添加每个轨道中的相同音频即可。例如,将第一个样本从轨道 1 添加到轨道 2,将第二个样本从轨道 1 添加到轨道 2,依此类推。理想情况下,最终结果是包含添加的样本的第三个数组,您将其传递给音轨实例的“write”方法。
这里一定要注意剪辑。如果您的数据类型为“short”,则允许的最大值为 32768。确保添加的样本不超过此限制的一个简单方法是执行加法并将结果存储在数据类型大于 Short (例如 int) 并评估结果。如果它大于 32768,则使其等于 32768 并将其转换回短路。
int result = track1[i] + track2[i];
if(result > 32768) {
result = 32768;
}
else if(result < -32768) {
result = -32768;
}
mixedAudio[i] = (short)result;
请注意上面的代码片段如何测试短路的最小范围。