我发现了这个链接,但我不知道如何实现它 split two channels of AudioRecord of CHANNEL_IN_STEREO
我想分离左右 channel 接收到的数据
下面是我的代码
for(int i = 0; i < read/2; i = i + 2)
{
leftChannelAudioData[i] = data[2*i];
leftChannelAudioData[i+1] = data[2*i+1];
rightChannelAudioData[i] = data[2*i+2];
rightChannelAudioData[i+1] = data[2*i+3];
}
完整源代码可以在这里找到:http://pastebin.com/ntm1mHG0
我已经尝试了从第298行到第322行,但它不起作用。它使我的应用程序崩溃:/
谢谢大家!
最佳答案
您的结果很接近,但如果您考虑 i==read/2-1
的情况,您可以看到 data[2*i+2]
读取到末尾之外数组的。由于每次迭代都会经历 for 样本,因此您需要像这样更改 for 循环:
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];
}
但现在的问题是,您正在读取左侧的 2 个样本,然后是右侧的 2 个样本(例如 LLRRLLRR),但音频通常是交错的 LRLRLR。
for(int i = 0; i < read/2; i = i + 2)
{
leftChannelAudioData[i] = data[2*i];
rightChannelAudioData[i+1] = data[2*i+1];
}
一种适用于任意数量 channel 的更强大的工作方式如下:
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;
}
关于java - Android - AudioRecord 在channel_in_stereo 中分割2 个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725339/