我遇到了这个链接,但我不确定如何实现它 split two channels of AudioRecord of CHANNEL_IN_STEREO
我想分开左右声道收到的数据
以下是我的代码
species site count density
1: A 1.1 25 0.419
2: A 1.2 152 2.546
3: A 2.1 26 0.436
4: A 3.5 1 0.017
5: A 3.7 98 1.641
---
101: B 1.2 6 0.174
102: B 1.3 10 0.291
103: B 2.1 8 0.233
104: B 2.2 8 0.233
105: B 2.3 5 0.145
可以在此处找到完整的来源:http://pastebin.com/ntm1mHG0
我已尝试从第298行到第322行,但它不起作用。它改为使我的应用程序崩溃:/
全部谢谢!
答案 0 :(得分:1)
您的结束但是如果您考虑data[2*i+2]
的情况,您可以看到for(int i = 0; i < read/4; i = i + 4)
{
leftChannelAudioData[i] = data[4*i];
leftChannelAudioData[i+1] = data[4*i+1];
rightChannelAudioData[i] = data[4*i+2];
rightChannelAudioData[i+1] = data[4*i+3];
}
读取超出数组末尾的情况。由于每次迭代都需要进行样本处理,因此需要更改for循环:
for(int i = 0; i < read/2; i = i + 2)
{
leftChannelAudioData[i] = data[2*i];
rightChannelAudioData[i+1] = data[2*i+1];
}
但现在的问题是你正在读左边的2个样本,然后是右边的2个样本(例如LLRRLLRR),但音频通常是交错的LRLRLR。
double[][] deinterleaveData(double[] samples, int numChannels)
{
// assert(samples.length() % numChannels == 0);
int numFrames = samples.length() / numChannels;
double[][] result = new double[numChannels][];
for (int ch = 0 ; ch < numChannels ; ch++)
{
result[ch] = new double[numFrames];
for (int i = 0 ; i < numFrames ; i++)
{
result[ch][i] = samples[numChannels*i+ch];
}
}
return result;
}
一种更有效的工作方式,适用于任意数量的频道,如下所示:
{{1}}