Android - channel_in_stereo 中 2 个声道的 AudioRecord 拆分
Android - AudioRecord splitting of 2 channels in channel_in_stereo
我遇到了这个 link 但我不确定如何实现它
split two channels of AudioRecord of CHANNEL_IN_STEREO
我想把左右通道接收到的数据分开
下面是我的代码
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(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];
}
一种适用于任意数量频道的更强大的工作方式是这样的:
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;
}
我遇到了这个 link 但我不确定如何实现它 split two channels of AudioRecord of CHANNEL_IN_STEREO
我想把左右通道接收到的数据分开
下面是我的代码
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(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];
}
一种适用于任意数量频道的更强大的工作方式是这样的:
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;
}